Python poskytuje nasledujúce bitové operátory, ktoré vykonávajú logickú konjunkciu, logickú disjunkciu, exkluzívnu disjunkciu, bitovú inverziu, ľavý bitový posun a pravý bitový posun na každom bite binárnej hodnoty celého čísla typu int.
&
|
^
~
<<
>>
V tejto časti najprv vysvetlíme nasledovné.
- križovatka (AND) :
&
- disjunkcia (OR) :
|
- Operácia EXCLUSIVE-OR (XOR) :
^
Ďalej sa budeme zaoberať nasledujúcimi otázkami.
- Bitové operácie so zápornými celými číslami
- bitové preklopenie ( NOT) :
~
- bitový posun :
<<
,>>
Ďalšie informácie o tom, ako zapisovať celé čísla v binárnej, osmičkovej a šestnástkovej sústave a ako konvertovať binárne, osmičkové a šestnástkové čísla a reťazce pomocou týchto funkcií, nájdete v nasledujúcom článku.
bin()
oct()
hex()
format()
- Súvisiace články:Prevod binárnych, oktálových a hexadecimálnych čísel a reťazcov z a do jazyka Python
Logické operácie (logické operácie) na logických hodnotách (true, false) namiesto bitových operácií nájdete v nasledujúcom článku. Namiesto &,| používajte and,or.
- Súvisiace články:Logické operátory jazyka Python a, alebo a nie (logická konjunkcia, disjunkcia, negácia)
križovatka (AND) : &operátor
Toto je príklad logického AND s použitím operátora &, pričom výsledok je prevedený na reťazec v binárnom zápise pomocou funkcie bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
disjunkcia (OR) : |operátor
Príklad logického súčinu (OR) s použitím operátora |, pričom výsledok sa prevedie na reťazec v binárnom zápise pomocou funkcie bin() a vypíše sa spolu.
print(x | y) print(bin(x | y)) # 11 # 0b1011
Operácia EXCLUSIVE-OR (XOR) : ^operátor
Príklad logického súčinu (XOR) pomocou operátora ^ v kombinácii s výsledkom konverzie na reťazec v binárnom zápise pomocou bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Vzťah medzi vstupom a výstupom pre každý bit logického AND, OR a XOR je uvedený v nasledujúcej tabuľke.
Vstup 1 | Vstup 2 | križovatka (AND) | disjunkcia (OR) | Operácia EXCLUSIVE-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Bitové operácie so zápornými celými číslami
Keď sa vykonáva bitová operácia so záporným celým číslom, hodnota sa spracuje, ako keby bola vyjadrená v dvojkovej forme.
Všimnite si však, že ak prevediete záporné celé číslo na binárny reťazec pomocou funkcie bin() alebo format(), absolútna hodnota bude mať znamienko mínus namiesto dvojkového formátu.
Ak chcete získať reťazec s dvojkovou reprezentáciou, použite AND s maximálnym požadovaným počtom bitových číslic, ako je uvedené nižšie.
- Pre 4-bitové
0b1111
(=0xf
) - Pre 8-bitové
0xff
- Pre 16-bitové
0xffff
Môžete získať reťazec dvojkovej reprezentácie (každý bit je invertovaný a 1 je pridaná).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Súvisiace články:Prevod binárnych, oktálových a hexadecimálnych čísel a reťazcov z a do jazyka Python
bitové preklopenie : ~operátor
~príklad obracania bitov pomocou operátorov.
Bitová inverzia nie je jednoducho invertovaná hodnota každého bitu. Návratová hodnota pri použití tohto operátora je nasledovná.~x
=-(x+1)
-(x+1)
Táto hodnota je ekvivalentná tomu, keď sa vstupná hodnota x považuje za dvojkový doplnok a všetky bity sa invertujú.
Ako už bolo spomenuté vyššie, v jazyku Python sa záporné celé číslo pri prevode na binárny reťazec pomocou funkcií bin(), format() atď. neprevádza vo forme dvojkového doplnku, ale v absolútnej hodnote so znamienkom mínus. Preto priamy prevod ~x na reťazec nebude mať za následok reťazec s invertovanými bitmi pôvodnej hodnoty.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Keď vykonáme operáciu AND a premeníme ju na reťazec dvojkovej reprezentácie, vidíme, že bity pôvodnej hodnoty sú invertované.
Okrem toho, ak chcete napríklad získať bitový reťazec, ktorý je štvormiestnym bitovým reťazcom invertovaným tak, ako je (vynechaný znamienkový bit), použite funkciu format() na doplnenie núl pre hodnotu AND takto'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
bitový posun : << , >>
Príklady ľavého a pravého bitového posunu pomocou operátorov bitového posunu.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
V prípade záporných hodnôt je znamienkový bit rozšírený a posunutý a kladné\záporné znamienko zostáva rovnaké. Záporná hodnota je obrazom riadku 1 až doľava.
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
Je lepšie uvažovať v podobe reťazcov dvojkových doplnkových výrazov, pretože uvažovanie v podobe čísel nie je jednoznačné.