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()
- Kapcsolódó cikkek:Bináris, oktális és hexadecimális számok és karakterláncok konvertálása egymásba és egymásból Pythonban
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.
- Kapcsolódó cikkek:A Python logikai operátorai and, or és not (logikai konjunkció, diszjunkció, negáció)
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. bemenet | Bemenet 2 | kereszteződés (AND) | diszjunkció (OR) | EXCLUSIVE-OR művelet (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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én
0b1111
(=0xf
) - A 8 bites
0xff
- A 16 bites
0xffff
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
- Kapcsolódó cikkek:Bináris, oktális és hexadecimális számok és karakterláncok konvertálása egymásba és egymásból Pythonban
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ű.