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

Бизнес

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

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

В този раздел първо ще обясним следното.

  • кръстовище (AND) : &
  • дизюнкция (OR) : |
  • Операция EXCLUSIVE-OR (XOR) : ^

След това ще обсъдим следното.

  • Побитови операции върху отрицателни цели числа
  • обръщане на битове ( NOT) : ~
  • преместване на битове : << , >>

За повече информация как да записвате цели числа в двоична, осмична и шестнадесетична система и как да преобразувате двоични, осмични и шестнадесетични числа и низове с помощта на следните функции, вижте следната статия.

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

Също така, за логически операции (булеви операции) върху булеви стойности (true, false) вместо побитови операции, вижте следната статия. Използвайте и,или вместо &,|.

кръстовище (AND) : &оператор

Това е пример за логическо И с помощта на оператора &, като резултатът е преобразуван в низ в двоичен запис с помощта на bin().

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

дизюнкция (OR) : |оператор

Пример за логическо произведение (ИЛИ) с помощта на оператора |, като резултатът се преобразува в низ в двоичен запис с помощта на bin() и се извежда заедно.

print(x | y)
print(bin(x | y))
# 11
# 0b1011

Операция EXCLUSIVE-OR (XOR) : ^оператор

Пример за логическо произведение (XOR) с помощта на оператора ^, комбинирано с резултата от преобразуването в низ в двоичен запис с помощта на bin().

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

Връзката между входа и изхода за всеки бит на логическите комбинации AND, OR и XOR е показана в таблицата по-долу.

Вход 1Вход 2кръстовище (AND)дизюнкция (OR)Операция EXCLUSIVE-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

За отрицателни стойности битът на знака се разширява и измества, а положителният\отрицателният знак остава същият. Отрицателната стойност е образ на ред от единици чак до лявата страна.

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