Python tarjoaa seuraavat bittikohtaiset operaattorit, jotka suorittavat loogisen konjunktion, loogisen disjunktion, eksklusiivisen disjunktion, bittikohtaisen inversion, vasemman bittisiirron ja oikean bittisiirron binäärisen kokonaislukutyyppisen int-arvon jokaiselle bitille.
&
|
^
~
<<
>>
Tässä jaksossa selitetään ensin seuraavaa.
- risteys (AND) :
&
- disjunktio (OR) :
|
- EXCLUSIVE-OR-toiminto (XOR) :
^
Seuraavaksi keskustelemme seuraavista asioista.
- Bittikohtaiset operaatiot negatiivisille kokonaisluvuille
- bittiflip ( NOT) :
~
- bittisiirto :
<<
,>>
Lisätietoja kokonaislukujen kirjoittamisesta binääri-, oktaali- ja heksadesimaalilukuna sekä binääri-, oktaali- ja heksadesimaalilukujen ja merkkijonojen muuntamisesta seuraavien funktioiden avulla on seuraavassa artikkelissa.
bin()
oct()
hex()
format()
- Aiheeseen liittyvät artikkelit:Muunna binääri-, oktaali- ja heksadesimaalilukuja ja merkkijonoja toisiinsa ja toisistaan Pythonissa.
Myös loogiset operaatiot (Boolean-operaatiot) boolean-arvoille (true, false) bittikohtaisten operaatioiden sijaan löytyvät seuraavasta artikkelista. Käytä and,or:ta &,|:n sijasta.
- Aiheeseen liittyvät artikkelit:Pythonin loogiset operaattorit and, or ja not (looginen konjunktio, disjunktio, negaatio).
risteys (AND) : &operaattori
Tämä on esimerkki loogisesta AND-operaattorista, jossa käytetään &-operaattoria, ja tulos muunnetaan bin()-operaattorilla merkkijonoksi binäärimuodossa.
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
disjunktio (OR) : |operaattori
Esimerkki loogisesta tuotteesta (OR) käyttäen |-operaattoria, jonka tulos muunnetaan bin()-operaattorilla merkkijonoksi binäärimuodossa ja tulostetaan yhdessä.
print(x | y) print(bin(x | y)) # 11 # 0b1011
EXCLUSIVE-OR-toiminto (XOR) : ^operaattori
Esimerkki loogisesta tuotteesta (XOR), jossa käytetään ^-operaattoria, yhdistettynä bin()-operaattorilla binäärimerkinnällä merkkijonoksi muunnetun tuloksen kanssa.
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Kunkin loogisen AND-, OR- ja XOR-menetelmän bitin tulon ja lähdön välinen suhde on esitetty alla olevassa taulukossa.
Tulo 1 | Tulo 2 | risteys (AND) | disjunktio (OR) | EXCLUSIVE-OR-toiminto (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Bittikohtaiset operaatiot negatiivisille kokonaisluvuille
Kun negatiiviselle kokonaisluvulle suoritetaan bittikohtainen operaatio, arvoa käsitellään ikään kuin se olisi ilmaistu kaksoiskomplementtimuodossa.
Huomaa kuitenkin, että jos muunnat negatiivisen kokonaisluvun binäärijonoksi bin()- tai format()-ohjelmalla, absoluuttinen arvo saa miinusmerkin kaksoiskomplementtimuodon sijasta.
Jos haluat saada merkkijonon, jossa on kaksoiskomplementtikuvaus, ota AND ja suurin tarvittava bittinumeroiden määrä, kuten alla on esitetty.
- 4-bittisille
0b1111
(=0xf
) - 8-bittisille
0xff
- 16-bittisille
0xffff
Voit saada merkkijonon kahden komplementin esityksen (jokainen bitti käännetään ja lisätään 1).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Aiheeseen liittyvät artikkelit:Muunna binääri-, oktaali- ja heksadesimaalilukuja ja merkkijonoja toisiinsa ja toisistaan Pythonissa.
bittiflip : ~operaattori
~esimerkki bittien kääntämisestä operaattoreiden avulla.
Bittikohtainen inversio ei ole pelkästään kunkin bitin arvon invertointi. Paluuarvo tätä operaattoria käytettäessä on seuraava.~x
=-(x+1)
-(x+1)
Tämä arvo vastaa sitä, että tuloarvo x katsotaan kahden komplementin muodossa ja kaikki bitit käännetään.
Kuten edellä mainittiin, kun negatiivinen kokonaisluku muunnetaan binääriseksi merkkijonoksi bin()-, format()- ja muiden funktioiden avulla, se ei ole Pythonissa kaksoiskomplementtimuodossa vaan absoluuttisena arvona miinusmerkin kanssa. Siksi muuntamalla ~x suoraan merkkijonoksi ei saada merkkijonoa, jossa alkuperäisen arvon bitit on käännetty.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Kun suoritamme AND-operaation ja muutamme sen kaksoiskomplementtikuvaukseksi, näemme, että alkuperäisen arvon bitit ovat invertoituneet.
Lisäksi esimerkiksi saadaksesi bittijonon, joka on sellaisenaan käänteinen 4-numeroinen bittijono (merkkibitti jätetty pois), käytä format()-toimintoa nollien täyttämiseksi AND-arvoon seuraavasti'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
bittisiirto : << , >>
Esimerkkejä vasemman ja oikean bittisiirrosta bittisiirto-operaattoreiden avulla.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
Negatiivisten arvojen kohdalla merkkibittiä laajennetaan ja siirretään, ja positiivinen\negatiivinen merkki pysyy samana. Negatiivinen arvo on kuva 1:n rivistä aina vasemmalle.
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
On parempi ajatella kaksoiskomplementtilausekkeiden merkkijonoina, koska numeroiden muodossa ajatteleminen ei ole selkeää.