Python предоставляет следующие битовые операторы, которые выполняют логическую конъюнкцию, логическую дизъюнкцию, эксклюзивную дизъюнкцию, битовую инверсию, сдвиг левого бита и сдвиг правого бита над каждым битом двоичного целочисленного значения типа int соответственно.
&
|
^
~
<<
>>
В этом разделе мы сначала объясним следующее.
- перекресток (AND) :
&
- дизъюнкция (OR) :
|
- Операция ИСКЛЮЧАЮЩЕЕ-ИЛИ (XOR) :
^
Далее мы обсудим следующее.
- Побитовые операции над отрицательными целыми числами
- побитовое переключение ( NOT) :
~
- битовый сдвиг :
<<
,>>
Подробнее о том, как записывать целые числа в двоичной, восьмеричной и шестнадцатеричной системах, а также как преобразовывать двоичные, восьмеричные и шестнадцатеричные числа и строки с помощью следующих функций, см. в следующей статье.
bin()
oct()
hex()
format()
- Похожие статьи:Преобразование двоичных, восьмеричных и шестнадцатеричных чисел и строк друг в друга и обратно в Python
Кроме того, для логических операций (булевых операций) над булевыми значениями (true, false) вместо побитовых операций, обратитесь к следующей статье. Используйте and, or вместо &,|.
- Похожие статьи:Логические операторы Python and, or, and not (логическая связь, дизъюнкция, отрицание)
перекресток (AND) : &оператор
Это пример логического И с использованием оператора &, результат которого преобразуется в строку в двоичной системе с помощью функции bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
дизъюнкция (OR) : |оператор
Пример логического произведения (OR) с использованием оператора |, при этом результат преобразуется в строку в двоичной нотации с помощью bin() и выводится вместе.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Операция ИСКЛЮЧАЮЩЕЕ-ИЛИ (XOR) : ^оператор
Пример логического произведения (XOR) с использованием оператора ^ в сочетании с результатом преобразования в строку в двоичной нотации с помощью bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Связь между входом и выходом для каждого бита логических операций AND, OR и XOR показана в таблице ниже.
Вход 1 | Вход 2 | перекресток (AND) | дизъюнкция (OR) | Операция ИСКЛЮЧАЮЩЕЕ-ИЛИ (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Побитовые операции над отрицательными целыми числами
Когда побитовая операция выполняется над отрицательным целым числом, значение обрабатывается так, как если бы оно было выражено в форме двойного дополнения.
Обратите внимание, однако, что если вы преобразуете отрицательное целое число в двоичную строку с помощью bin() или format(), то абсолютное значение будет иметь знак минус, а не формат двойного дополнения.
Если вы хотите получить строку с двухкомпонентным представлением, возьмите AND с максимальным количеством необходимых битовых разрядов, как показано ниже.
- Для 4-битного
0b1111
(=0xf
) - Для 8-битного
0xff
- Для 16-битного
0xffff
Вы можете получить строку в двухкомпонентном представлении (каждый бит инвертируется и добавляется 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Похожие статьи:Преобразование двоичных, восьмеричных и шестнадцатеричных чисел и строк друг в друга и обратно в Python
побитовое переключение : ~оператор
~ пример перелистывания битов с помощью операторов.
Побитовая инверсия — это не просто значение каждого инвертированного бита. Возвращаемое значение при использовании этого оператора выглядит следующим образом.~x
=-(x+1)
-(x+1)
Это значение эквивалентно рассмотрению входного значения x в форме двойного дополнения и инвертированию всех битов.
Как упоминалось выше, в Python, когда отрицательное целое число преобразуется в двоичную строку с помощью bin(), format() и т.д., оно представляется не в виде двух дополнений, а в виде абсолютного значения со знаком минус. Поэтому преобразование ~x непосредственно в строку не приведет к получению строки с инвертированными битами исходного значения.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Когда мы выполняем операцию AND и превращаем ее в строку представления дополнения двойки, мы видим, что биты исходного значения инвертированы.
Кроме того, например, для получения битовой строки, которая является 4-значной битовой строкой, инвертированной как есть (знаковый бит опущен), используйте format() для заполнения нулей для ANDed значения следующим образом'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
битовый сдвиг : << , >>
Примеры сдвига левого бита и сдвига правого бита с использованием операторов сдвига битов.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
Для отрицательных значений бит знака расширяется и сдвигается, а положительный\отрицательный знак остается неизменным. Отрицательное значение представляет собой изображение линии из 1 до упора влево.
x = -9 print(bin(x)) print(bin(x & 0xff)) # -0b1001 # 0b11110111 print(x << 1) print(bin(x << 1)) print(bin((x << 1) & 0xff)) # -18 # -0b10010 # 0b11101110 print(x >> 1) print(bin(x >> 1)) print(bin((x >> 1) & 0xff)) # -5 # -0b101 # 0b11111011
Лучше мыслить в терминах строк выражений с двумя дополнениями, поскольку мыслить в терминах чисел не совсем понятно.