Побитовые операторы Python (логическое произведение, логическое ИЛИ, исключающее ИЛИ, инверсия, сдвиг)

Бизнес

Python предоставляет следующие битовые операторы, которые выполняют логическую конъюнкцию, логическую дизъюнкцию, эксклюзивную дизъюнкцию, битовую инверсию, сдвиг левого бита и сдвиг правого бита над каждым битом двоичного целочисленного значения типа int соответственно.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

В этом разделе мы сначала объясним следующее.

  • перекресток (AND) : &
  • дизъюнкция (OR) : |
  • Операция ИСКЛЮЧАЮЩЕЕ-ИЛИ (XOR) : ^

Далее мы обсудим следующее.

  • Побитовые операции над отрицательными целыми числами
  • побитовое переключение ( NOT) : ~
  • битовый сдвиг : << , >>

Подробнее о том, как записывать целые числа в двоичной, восьмеричной и шестнадцатеричной системах, а также как преобразовывать двоичные, восьмеричные и шестнадцатеричные числа и строки с помощью следующих функций, см. в следующей статье.

  • bin()
  • oct()
  • hex()
  • format()

Кроме того, для логических операций (булевых операций) над булевыми значениями (true, false) вместо побитовых операций, обратитесь к следующей статье. Используйте and, or вместо &,|.

перекресток (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)
11110
10011
01011
00000

Побитовые операции над отрицательными целыми числами

Когда побитовая операция выполняется над отрицательным целым числом, значение обрабатывается так, как если бы оно было выражено в форме двойного дополнения.

Обратите внимание, однако, что если вы преобразуете отрицательное целое число в двоичную строку с помощью 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

побитовое переключение : ~оператор

~ пример перелистывания битов с помощью операторов.

Побитовая инверсия — это не просто значение каждого инвертированного бита. Возвращаемое значение при использовании этого оператора выглядит следующим образом.
~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

Лучше мыслить в терминах строк выражений с двумя дополнениями, поскольку мыслить в терминах чисел не совсем понятно.

Copied title and URL