Python bitenkénti operátorok (logikai szorzat, logikai VAGY, exkluzív VAGY, inverzió, eltolás)

Üzleti

A Python a következő bitenkénti operátorokat biztosítja, amelyek logikai konjunkciót, logikai diszjunkciót, exkluzív diszjunkciót, bitenkénti inverziót, bal oldali biteltolást és jobb oldali biteltolást végeznek egy int típusú bináris egész szám érték minden egyes bitjén.

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

Ebben a szakaszban először a következőket ismertetjük.

  • kereszteződés (AND) : &
  • diszjunkció (OR) : |
  • EXCLUSIVE-OR művelet (XOR) : ^

Ezután a következőket fogjuk megvitatni.

  • Bitsebességes műveletek negatív egész számokkal
  • bit flip ( NOT) : ~
  • biteltolódás : << , >>

Az egész számok bináris, oktális és hexadecimális írásmódjáról, valamint a bináris, oktális és hexadecimális számok és karakterláncok átalakításáról a következő függvények segítségével a következő cikkben olvashat.

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

A logikai műveletek (Boole-műveletek) bólus értékeken (igaz, hamis) végzett logikai műveleteihez a bitenkénti műveletek helyett lásd a következő cikket. Használja az and,or-t az &,| helyett.

kereszteződés (AND) : &üzemeltető

Ez egy példa az & operátorral végzett logikai ÉS műveletre, amelynek eredményét bin() segítségével bináris jelölésű karakterlánccá alakítjuk.

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

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

diszjunkció (OR) : |üzemeltető

Egy példa egy logikai szorzatra (VAGY) a | operátor használatával, az eredmény bin() segítségével bináris jelölésű karakterlánccá alakítva és együttesen kiadva.

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

EXCLUSIVE-OR művelet (XOR) : ^üzemeltető

Példa egy logikai szorzatra (XOR) a ^ operátor használatával, kombinálva a bin() bináris jelöléssel történő stringgé alakítás eredményével.

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

A logikai ÉS, VAGY és XOR egyes bitjeinek bemenete és kimenete közötti kapcsolatot az alábbi táblázat mutatja.

1. bemenetBemenet 2kereszteződés (AND)diszjunkció (OR)EXCLUSIVE-OR művelet (XOR)
11110
10011
01011
00000

Bitsebességes műveletek negatív egész számokkal

Amikor bitenkénti műveletet hajtunk végre egy negatív egész számmal, az értéket úgy dolgozzuk fel, mintha kettes komplement formában lenne kifejezve.

Vegye azonban figyelembe, hogy ha egy negatív egész számot bin() vagy format() segítségével bináris karakterlánccá konvertál, akkor az abszolút érték mínusz előjellel fog rendelkezni a kettes komplement formátum helyett.

Ha kétkomplementes ábrázolású karakterláncot szeretnénk kapni, akkor vegyük az ÉS-t a maximálisan szükséges bitszámmal, ahogy az alábbiakban látható.

  • 4-bit esetén0b1111 (=0xf)
  • A 8 bites0xff
  • A 16 bites0xffff

Kettő-komplement ábrázolású karakterláncot kaphatunk (minden bitet invertálunk és 1-et adunk hozzá).

x = -9

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

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

bit flip : ~üzemeltető

~példa a bitek felcserélésére operátorokkal.

A bitenkénti inverzió nem egyszerűen az egyes bitek értékét invertálja. Az operátor használata esetén a visszatérési érték a következő.
~x=-(x+1)

-(x+1)Ez az érték egyenértékű azzal, hogy az x bemeneti értéket kétkomplementesnek tekintjük, és az összes bitet invertáljuk.

Mint fentebb említettük, a Pythonban, amikor egy negatív egész számot bin(), format() stb. segítségével bináris karakterlánccá alakítunk, az nem kettes komplementer formában, hanem mínusz előjellel ellátott abszolút értékként jelenik meg. Ezért a ~x közvetlen stringgé konvertálása nem fog olyan stringet eredményezni, amelyben az eredeti érték bitjei invertálva vannak.

x = 9  # 0b1001

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

Ha elvégezzük az ÉS műveletet, és átváltoztatjuk kettes komplement ábrázolású karakterlánccá, láthatjuk, hogy az eredeti érték bitjei invertálva vannak.

Ezen kívül, például egy olyan bitsorozathoz, amely egy 4 számjegyű bitsorozat, invertálva (előjeles bit kihagyva), a format() segítségével töltse ki a nullákat az ÉS-elt értékhez az alábbiak szerint.'04b'

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

biteltolódás : << , >>

Példák a bal oldali és jobb oldali biteltolásra a biteltolási operátorok használatával.

x = 9  # 0b1001

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

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

Negatív értékek esetén az előjelbit kibővül és eltolódik, a pozitív\negatív előjel pedig változatlan marad. A negatív érték egy 1-es sor képe egészen balra.

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

Jobb, ha kettes kiegészítésű kifejezések sorozataiban gondolkodunk, mivel a számokban való gondolkodás nem egyértelmű.