Python bitni operatori (logički proizvod, logičko OR, ekskluzivno OR, inverzija, pomak)

Poslovanje

Python pruža sljedeće bitne operatore koji izvode logičku konjunkciju, logičku disjunkciju, isključivu disjunkciju, bitnu inverziju, pomak bita ulijevo i pomak bita udesno za svaki bit binarnog cjelobrojnog tipa int vrijednosti, respektivno.

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

U ovom odjeljku prvo ćemo objasniti sljedeće.

  • križanje(AND) :&
  • disjunkcija(OR) :|
  • ISKLJUČIVO-ILI rad(XOR) :^

Zatim ćemo razgovarati o sljedećem.

  • Bitne operacije nad negativnim cijelim brojevima
  • bit flip( NOT) :~
  • bitni pomak:<<,>>

Za više informacija o tome kako pisati cijele brojeve u binarnom, oktalnom i heksadecimalnom obliku te kako pretvoriti binarne, oktalne i heksadecimalne brojeve i nizove pomoću sljedećih funkcija, pogledajte sljedeći članak.

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

Također, za logičke operacije (Booleove operacije) na booleovim vrijednostima (true, false) umjesto bitnih operacija pogledajte sljedeći članak. Koristite i,ili umjesto &,|.

križanje(AND) :&operater

Ovo je primjer logičkog I koji koristi & operator, s rezultatom pretvorenim u niz u binarnom zapisu pomoću bin().

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

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

disjunkcija(OR) :|operater

Primjer logičkog proizvoda (OR) koji koristi | operator, s rezultatom koji se pretvara u niz u binarnom zapisu pomoću bin() i izlazi zajedno.

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

ISKLJUČIVO-ILI rad(XOR) :^operater

Primjer logičkog proizvoda (XOR) koji koristi operator ^, u kombinaciji s rezultatom pretvorbe u niz u binarnom zapisu pomoću bin().

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

Odnos između ulaza i izlaza za svaki bit logičkog I, ILI i XOR prikazan je u donjoj tablici.

Unos 1Unos 2križanje(AND)disjunkcija(OR)ISKLJUČIVO-ILI rad(XOR)
11110
10011
01011
00000

Bitne operacije nad negativnim cijelim brojevima

Kada se bitna operacija izvodi nad negativnim cijelim brojem, vrijednost se obrađuje kao da je izražena u obliku komplementa dva.

Međutim, imajte na umu da ako pretvorite negativan cijeli broj u binarni niz pomoću bin() ili format(), apsolutna vrijednost će imati predznak minus umjesto formata komplementa dvojke.

Ako želite dobiti niz s komplementarnim prikazom dva, uzmite I s maksimalnim potrebnim brojem bitova, kao što je prikazano u nastavku.

  • Za 4-bitne0b1111(=0xf)
  • Za 8-bitne0xff
  • Za 16-bitne0xffff

Možete dobiti niz prikaza komplementa dva (svaki bit je obrnut i 1 se dodaje).

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

bit flip:~operater

~primjer okretanja bita s operatorima.

Bitna inverzija nije samo vrijednost svakog invertiranog bita. Povratna vrijednost kada se koristi ovaj operator je sljedeća.
~x#ERROR!-(x+1)

-(x+1)Ova vrijednost je ekvivalentna razmatranju ulazne vrijednosti x kao komplementarnog oblika dvojke i invertiranju svih bitova.

Kao što je gore spomenuto, u Pythonu, kada se negativni cijeli broj pretvara u binarni niz pomoću bin(), format(), itd., on nije u komplementarnom obliku dva, već u apsolutnoj vrijednosti sa predznakom minus. Stoga, pretvaranje ~x izravno u niz neće rezultirati nizom s invertiranim bitovima izvorne vrijednosti.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

Kada izvedemo operaciju AND i pretvorimo je u niz komplementarnog prikaza dvojke, možemo vidjeti da su bitovi izvorne vrijednosti invertirani.

Osim toga, na primjer, da biste dobili niz bitova koji je 4-znamenkasti niz bitova obrnut kakav jest (značni bit je izostavljen), upotrijebite format() da popunite nule za vrijednost AND na sljedeći način04b'

print(bin(~x & 0xff))
print(format(~x & 0b1111, '04b'))
# 0b11110110
# 0110

bitni pomak:<<,>>

Primjeri pomaka bita ulijevo i desnog pomaka bita pomoću operatora pomaka bita.

x = 9  # 0b1001

print(x << 1)
print(bin(x << 1))
# 18
# 0b10010

print(x >> 1)
print(bin(x >> 1))
# 4
# 0b100

Za negativne vrijednosti, bit predznaka se produžuje i pomiče, a pozitivni/negativni predznak ostaje isti. Negativna vrijednost je slika retka od 1s skroz lijevo.

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

Bolje je razmišljati u terminima nizova izraza komplementa dvojke, budući da razmišljanje u terminima brojeva nije jasno.