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

Пример.

# Битовая операция & (И, 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. Битовый оператор ^ (исключающее ИЛИ, XOR). Пример

Битовый оператор исключительное ИЛИ обозначается символом ^ и выполняет операцию сложения по модулю 2 для любого бита операндов. Общая форма оператора следующая

op1 ^ op2

где op1, op2 – целочисленные операнды.

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

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

На рисунке 3 отображен пример битового исключающего ИЛИ для двух операндов.

Python. Битовый оператор "исключающее ИЛИ" (XOR)

Рисунок 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

 


Связанные темы