Python. Бітові оператори

Бітові оператори


Зміст


1. Призначення бітових операторів. Перелік

Мова Python підтримує роботу з двійковими розрядами (бітами) цілочисельних величин, де кожен біт числа розглядається окремо. Для забезпечення цього в Python використовуються так звані бітові або порозрядні оператори, що реалізують загальновідомі бітові операції. Підтримка бітових операторів є також в інших мовах програмування.

У бітових операторах (операціях) кожен операнд розглядається як послідовність двійкових розрядів (бітів), що приймають значення 0 або 1 (двійкова система числення). Над цими розрядами можна виконувати відомі операції (логічне “І”, логічне “АБО” і т.д.)

Перелік бітових операторів мови Python в порядку спадання пріоритету наступний:

  • ~ – бітовий оператор НІ (інверсія, найвищий пріоритет);
  • <<, >> – оператори зсуву вліво або зсуву вправо на задану кількість біт;
  • & – бітовий оператор І (AND);
  • ^ – бітове виключне АБО (XOR);
  • | – бітовий оператор АБО (OR).

 

2. Бітовий оператор ~ (інверсія). Приклад

У бітовому операторі (операції) ~ інверсія значення кожного біту числа змінюється на протилежне. Значення біту 0 встановлюється в 1, а значення 1 встановлюється в 0. Тобто, додатнє число стає від’ємним зі зсувом на -1. Так само від’ємне число стає додатнім зі зсувом на -1.

Приклад.

# Бітовий оператор ~ НІ - інверсія
a = 0b1001 # a = 9 в десятковій системі
b = ~a # b = -10 - десяткова система
c = bin(b) # c = -0b1010 - двійкова система

a = -0b1001 # a = -9 в десятковій системі
b = ~a # b = 8 - десяткова система
c = bin(b) # c = 0b1000 - двійкова система

a = 0b1111 # a = 15
b = ~a # b = -16
c = bin(b) # c = -0b10000

a = -0b1111 # a = -15
b = ~a # b = 14
c = bin(b) # c = 0b1110

 

3. Оператори зсуву вліво <<, вправо >>. Приклад

Оператори зсуву вліво << та зсуву вправо >> зсувають кожен біт на одну або декілька позицій вліво чи вправо. Загальна форма операторів наступна

op1 << op2
op1 >> op2

де op1, op2 – операнди. Операндом може бути число, змінна цілочисельного типу або вираз, що повертає цілочисельний результат.

На рисунку 1 продемонстровано роботу операторів зсуву вліво << та зсуву вправо >>. При обчисленні значення y, значення x зсувається на 1 позицію вліво (випадок а) або вправо (випадок b). Відповідно результат y множиться на 2 або ділиться на 2.

Python. Робота операцій зсуву вліво << та зсуву вправо >>

Рисунок 1. Робота операцій: а) зсув вліво << (множення на 2); b) зсув вправо >> (ділення на 2 націло)

Якщо потрібно помножити число на 16, то потрібно зсунути це число на 4 біти вліво. Якщо потрібно поділити число на 8, то потрібно зсунути це число на 3 біти вправо. Швидкість виконання операцій зсуву вища порівняно з операціями множення та ділення на числа кратні 2 в степені N (N – кількість зсунутих біт).

Приклад.

# Операції зсуву вліво << та зсуву вправо >>
x = 5 # зсув вліво на 3 знаки, множення на 2**3 = 8
y = x << 3 # y = x*2**3 = 40
print('x = ', x)
print('y = x<<3 = ', y)

x = 25
y = x >> 2 # y = 6
print('x = ', x)
print('y = x>>2 = ', y)

# Для від'ємних чисел
x = -10
y = x << 1 # y = -20
print('x = ', x)
print('y = x<<1 = ', y)

x = -100
y = x >> 3 # y = -13
print('x = ', x)
print('y = x>>3 = ', y)

Результат роботи програми

x = 5
y = x<<3 = 40
x = 25
y = x>>2 = 6
x = -10
y = x<<1 = -20
x = -100
y = x>>3 = -13

 

4. Бітовий оператор & (І, AND). Приклад

Бітовий оператор І (AND) є бінарним і виконує побітове “І” для кожної пари бітів операндів, що розміщуються зліва та справа від знаку оператора &. Загальна форма оператора наступна

op1 & op2

де op1, op2 – операнди. Операндами можуть бути числа, змінні цілочисельного типу або вирази, що повертають цілочисельний результат.



Кожен цілочисельний операнд розглядається як набір бітів, над кожним з яких виконується побітова операція “І”.

На рисунку 2 показано роботу бітової операції “І”.

Python. Робота бітового оператора & (логічне І)

Рисунок 2. Бітовий оператор & “І”

Як видно з рисунку біт в позиції 0 першого операнда (x) обчислюється з бітом в позиції 0 другого операнду (y), відповідно біт в позиції 1 першого операнду (x) обчислюється з бітом в позиції 1 другого операнду (y) і т.д. При таких обчислення результуюче значення кожного біту визначається за наступними формулами:

0 & 0 = 0
0 & 1 = 0
1 & 0 = 0
1 & 1 = 1

Приклад.

# Бітова операція & (I, AND)
x = 37
y = 58
z = x & y # z = 32
print('x = ', x)
print('y = ', y)
print('z = ', z)

Результат роботи програми

x = 37
y = 58
z = 32

 

5. Бітовий оператор ^ виключне АБО. Приклад

Бітовий оператор виключне АБО позначаєтья символом ^ і виконує операцію додавання за модулем 2 для кожного біту операндів. Загальна форма оператора наступна

op1 ^ op2

де op1, op2 – операнди, що мають цілочисельний тип.

Оператор виключне АБО (XOR) оперує двійковими розрядами. Кожен операнд розглядається як послідовність бітів. Результат побітового виключного АБО визначається за наступними формулами

0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0

На рисунку 3 відображено приклад бітового виключного АБО для двох операндів.

Python. Робота бітового оператора ^ "виключне АБО"

Рисунок 3. Бітовий оператор ^ “виключне АБО”

Приклад.

# Бітовий оператор ^ - виключне АБО (XOR)
x = 37
y = 58
z = x ^ y # z = 31
print('x = ', x)
print('y = ', y)
print('z = ', z)

Результат роботи програми

x = 37
y = 58
z = 31

 

6. Бітовий оператор | АБО (OR). Приклад

Бітовий оператор АБО (OR) є бінарною і позначається символом |. Оператор реалізує побітове логічне додавання за зразком операторів & та ^ (див. п.п. 4, 5).

Загальна форма бітового оператора | наступна

op1 | op2

де op1, op2 – операнди, які можуть бути змінними або числами цілого типу.

Для двох операндів op1, op2 бітове АБО виконується згідно з наступними правилами

0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1

На рисунку 4 продемонстровано роботу бітового оператора АБО на прикладі двох довільних операндів

Python. Робота бітового оператора АБО

Рисунок 4. Бітовий оператор АБО

Приклад.

# Бітове АБО (OR)
x = 37
y = 58
z = x | y # z = 63
print('x = ', x)
print('y = ', y)
print('z = ', z)

Результат роботи програми

x = 37
y = 58
z = 63

 

7. Приклади використання бітових операторів

Приклад 1. Витягнути з числа 4,5,6 біти і визначити їх цілочисельне значення.

# Витягнути 4,5,6 біти цілого числа
# ввести ціле число
number = int(input('Input number: '))

# фільтр на 4,5,6 біти
number &= 0b1110000

# зсунути на 4 розряди вправо
number >>= 4
print('number = ', number)

Результат роботи програми

Input number: 95
number = 5

Приклад 2. Помножити значення двох чисел. У першому числі взяти біти, що розміщені у позиціях 0-5. У другому числі взяти біти, що розміщені у позиціях 0-7.

# Помножити 0-5 біти першого числа на 0-7 біти другого числа
# ввести цілі числа
x = int(input('x = '))
y = int(input('y = '))

# фільтр на 0-5 біти
x &= 0b11111

# фільтр на 0-7 біти
y &= 0b1111111

# помножити
z = x*y

print('x = ', x)
print('y = ', y)
print('z = ', z)

Результат роботи програми

x = 234234253
y = 322797987
x = 13
y = 35
z = 455

 


Зв’язані теми