Битовые операторы
Связанные темы
- 1. Назначение битовых операторов. Перечень
- 2. Битовый оператор ~ (инверсия). Пример
- 3. Операторы сдвига влево <<, вправо >>. Пример
- 4. Битовый оператор & (И, AND). Пример
- 5. Битовый оператор ^ (исключающее ИЛИ, XOR). Пример
- 6. Битовый оператор | ИЛИ (OR). Пример
- 7. Примеры использования битовых операторов
- Связанные темы
Поиск на других ресурсах:
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.
Рисунок 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 показана работа битовой операции «И».
Рисунок 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 отображен пример битового исключающего ИЛИ для двух операндов.
Рисунок 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 продемонстрирована работа битового оператора ИЛИ на примере двух произвольных операндов
Рисунок 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
⇑
Связанные темы
⇑