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()
- Povezani članki:Pretvarjanje binarnih, oktalnih in heksadecimalnih števil in nizov med seboj in iz njih v programu Python
Za logične operacije (Booleove operacije) na logičnih vrednostih (true, false) namesto bitnih operacij glejte naslednji članek. Uporabite and,or namesto &,|.
- Povezani članki:Pitonovi logični operatorji in, ali in ne (logična konjunkcija, disjunkcija, negacija)
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 1 | Vhod 2 | križišče (AND) | disjunkcija (OR) | Operacija EXCLUSIVE-OR (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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-bitne
0b1111
(=0xf
) - Za 8-bitne
0xff
- Za 16-bitne
0xffff
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
- Povezani članki:Pretvarjanje binarnih, oktalnih in heksadecimalnih števil in nizov med seboj in iz njih v programu Python
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.