Pythonin bittioperaattorit (looginen tulo, looginen TAI, eksklusiivinen TAI, inversio, siirto).

liiketoiminta

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()

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.

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 1Tulo 2risteys (AND)disjunktio (OR)EXCLUSIVE-OR-toiminto (XOR)
11110
10011
01011
00000

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-bittisille0b1111 (=0xf)
  • 8-bittisille0xff
  • 16-bittisille0xffff

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

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ää.