Pythonovi bitni operatorji (logični produkt, logična OR, izključujoča OR, inverzija, premik)

Posel

Python ponuja naslednje bitne operatorje, ki izvajajo logično konjunkcijo, logično disjunkcijo, ekskluzivno disjunkcijo, bitno inverzijo, levi bitni premik in desni bitni premik na vsakem bitu vrednosti binarnega celega števila tipa int.

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

V tem razdelku najprej pojasnimo naslednje.

  • križišče (AND) : &
  • disjunkcija (OR) : |
  • Operacija EXCLUSIVE-OR (XOR) : ^

Nato bomo razpravljali o naslednjem.

  • Bitne operacije z negativnimi celimi števili
  • obračanje bitov ( NOT) : ~
  • bitni premik : << , >>

Več informacij o zapisovanju celih števil v dvojiški, osmiški in šestnajstiški obliki ter pretvorbi dvojiških, osmiških in šestnajstiških števil in nizov z uporabo naslednjih funkcij najdete v naslednjem članku.

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

Za logične operacije (Booleove operacije) na logičnih vrednostih (true, false) namesto bitnih operacij glejte naslednji članek. Uporabite and,or namesto &,|.

križišče (AND) : &operater

To je primer logične kombinacije AND z uporabo operatorja &, rezultat pa je s funkcijo bin() pretvorjen v niz v binarnem zapisu.

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

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

disjunkcija (OR) : |operater

Primer logičnega produkta (OR) z uporabo operatorja |, pri čemer se rezultat s funkcijo bin() pretvori v niz v binarnem zapisu in izpiše skupaj.

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

Operacija EXCLUSIVE-OR (XOR) : ^operater

Primer logičnega produkta (XOR) z uporabo operatorja ^ v kombinaciji z rezultatom pretvorbe v niz v binarnem zapisu s funkcijo bin().

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

Razmerje med vhodom in izhodom za vsak bit logičnega AND, OR in XOR je prikazano v spodnji tabeli.

Vhod 1Vhod 2križišče (AND)disjunkcija (OR)Operacija EXCLUSIVE-OR (XOR)
11110
10011
01011
00000

Bitne operacije z negativnimi celimi števili

Ko se na negativnem celem številu izvede bitna operacija, se vrednost obdela, kot da bi bila izražena v dvokomponentni obliki.

Če negativno celo število pretvorite v binarni niz z uporabo funkcij bin() ali format(), bo absolutna vrednost imela znak minus namesto dvokomponentne oblike.

Če želite dobiti niz z dvojno dopolnitvijo, uporabite AND z največjim potrebnim številom bitov, kot je prikazano spodaj.

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

Lahko dobite niz z dvojno dopolnitvijo (vsak bit se invertira in doda 1).

x = -9

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

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

obračanje bitov : ~operater

~primer obračanja bitov z operaterji.

Bitna inverzija ni samo vrednost vsakega invertiranega bita. Vrnjena vrednost pri uporabi tega operatorja je naslednja.
~x=-(x+1)

-(x+1)Ta vrednost je enakovredna obravnavi vhodne vrednosti x v obliki dvojčka in invertiranju vseh bitov.

Kot smo že omenili, v Pythonu negativno celo število pri pretvorbi v binarni niz z uporabo funkcij bin(), format() itd. ni v obliki dvojnega dopolnila, temveč v obliki absolutne vrednosti z znakom minus. Zato pri neposredni pretvorbi ~x v niz ne bomo dobili niza z invertiranimi biti prvotne vrednosti.

x = 9  # 0b1001

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

Ko izvedemo operacijo AND in jo pretvorimo v niz dvokomponentne predstavitve, vidimo, da so biti prvotne vrednosti invertirani.

Če želite na primer dobiti bitni niz, ki je 4-mestni bitni niz, invertiran kot je (znakovni bit je izpuščen), uporabite format(), da zapolnite ničle za vrednost AND na naslednji način'04b'

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

bitni premik : << , >>

Primeri levega in desnega bitnega premika z uporabo operatorjev bitnega premika.

x = 9  # 0b1001

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

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

Pri negativnih vrednostih se bit znaka podaljša in premakne, pozitivni\negativni znak pa ostane enak. Negativna vrednost je slika vrstice enic vse do leve strani.

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 v obliki nizov dvokomponentnih izrazov, saj razmišljanje v obliki števil ni jasno.

Copied title and URL