Pythoni bitioperatsioonid (loogiline korrutis, loogiline VÕI, eksklusiivne VÕI, inversioon, nihe)

Äri

Python pakub järgmisi bititihedaid operaatoreid, mis täidavad vastavalt loogilist konjunktsiooni, loogilist disjunktsiooni, eksklusiivset disjunktsiooni, bititihedat inversiooni, vasaku biti nihet ja parema biti nihet binaarse täisarvu tüüpi int väärtuse iga biti suhtes.

  • &
  • |
  • ^
  • ~
  • <<
  • >>

Selles jaotises selgitame kõigepealt järgmist.

  • ristmik (AND) : &
  • disjunktsioon (OR) : |
  • EXCLUSIVE-OR operatsioon (XOR) : ^

Järgnevalt arutame järgmist.

  • Bititihedad operatsioonid negatiivsete täisarvudega
  • bittide pööramine ( NOT) : ~
  • biti nihkumine : << , >>

Lisateavet selle kohta, kuidas kirjutada täisarvusid binaarses, kaheksakohalises ja kuueteistkümnendsüsteemis ning kuidas teisendada binaar-, kaheksakohalisi ja kuueteistkümnendsüsteemi numbreid ja jadasid järgmiste funktsioonide abil, leiate järgmisest artiklist: “Binaar-, kaheksakohalisi ja kuueteistkümnendsüsteem”.

  • bin()
  • oct()
  • hex()
  • format()

Samuti, loogiliste operatsioonide (Boole'i operatsioonide) kohta bool'i väärtustega (true, false) bittide kaupa tehtavate operatsioonide asemel, vt järgmist artiklit. Kasutage ja,või asemel &,|.

ristmik (AND) : &operaator

See on näide loogilisest AND-ist, kasutades operaatorit &, mille tulemus teisendatakse bin() abil stringiks binaarses märkimisviisis.

x = 9   # 0b1001
y = 10  # 0b1010

print(x & y)
print(bin(x & y))
# 8
# 0b1000

disjunktsioon (OR) : |operaator

Näide loogilisest produktist (VÕI), kasutades operaatorit |, mille tulemus teisendatakse bin() abil stringiks binaarses märkimisviisis ja väljastatakse koos.

print(x | y)
print(bin(x | y))
# 11
# 0b1011

EXCLUSIVE-OR operatsioon (XOR) : ^operaator

Näide loogilisest produktist (XOR), kasutades operaatorit ^, kombineerituna bin() abil stringiks teisendamise tulemusega binaarses märkimisviisis.

print(x ^ y)
print(bin(x ^ y))
# 3
# 0b11

Iga loogilise AND-, OR- ja XOR-biti sisendi ja väljundi vaheline seos on näidatud alljärgnevas tabelis.

Sisend 1Sisend 2ristmik (AND)disjunktsioon (OR)EXCLUSIVE-OR operatsioon (XOR)
11110
10011
01011
00000

Bititihedad operatsioonid negatiivsete täisarvudega

Kui negatiivse täisarvuga tehakse bitioperatsioon, töödeldakse väärtust nii, nagu oleks see väljendatud kahekomplektilises vormis.

Pange aga tähele, et kui te teisendate negatiivse täisarvu bin() või format() abil binaarseks stringiks, siis on absoluutväärtus miinusmärgiga, mitte kahekomplektilise formaadiga.

Kui soovite saada stringi kahekomplektilise esitusviisiga, võtke AND koos maksimaalse nõutava bitikohtade arvuga, nagu on näidatud allpool.

  • 4-bitise versiooni puhul0b1111 (=0xf)
  • 8-bitise versiooni puhul0xff
  • 16-bitise versiooni puhul0xffff

Saate stringi kahekomplektilise esitusviisi (iga bitt on inverteeritud ja 1 on lisatud).

x = -9

print(x)
print(bin(x))
# -9
# -0b1001

print(bin(x & 0xff))
print(format(x & 0xffff, 'x'))
# 0b11110111
# fff7

bittide pööramine : ~operaator

~näide bittide pööramisest operaatoritega.

Biti kaupa inverteerimine ei ole lihtsalt iga biti väärtuse inverteerimine. Selle operaatori kasutamisel on tagastusväärtus järgmine.
~x=-(x+1)

-(x+1)See väärtus on samaväärne sisendväärtuse x käsitlemisega kahekomplementaarsel kujul ja kõigi bittide inverteerimisega.

Nagu eespool mainitud, on Pythonis, kui negatiivne täisarv teisendatakse bin(), format() jne abil binaarseks stringiks, see mitte kahekomplektilises vormis, vaid absoluutväärtusena koos miinusmärgiga. Seetõttu ei anna ~x otsene teisendamine stringiks tulemuseks stringi, mille algväärtuse bitid on inverteeritud.

x = 9  # 0b1001

print(~x)
print(bin(~x))
# -10
# -0b1010

Kui teeme AND-operatsiooni ja muudame selle stringi kahekomplektiliseks esituseks, näeme, et algväärtuse bitid on inverteeritud.

Lisaks, näiteks, et saada bittide string, mis on 4-kohaline bittide string inverteeritud nagu on (märgibitt välja jäetud), kasutage format(), et täita nullid ANDitud väärtuse jaoks järgnevalt'04b'

print(bin(~x & 0xff))
print(format(~x & 0b1111, '04b'))
# 0b11110110
# 0110

biti nihkumine : << , >>

Näited vasakpoolse biti nihke ja parempoolse biti nihke kohta biti nihkeoperaatorite abil.

x = 9  # 0b1001

print(x << 1)
print(bin(x << 1))
# 18
# 0b10010

print(x >> 1)
print(bin(x >> 1))
# 4
# 0b100

Negatiivsete väärtuste puhul pikendatakse ja nihutatakse märgibitti ning positiivne\negatiivne märk jääb samaks. Negatiivne väärtus kujutab endast 1s-rea kujutist kogu vasakule.

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

Parem on mõelda kahekomplektiliste avaldiste jadana, sest arvudes mõtlemine ei ole selge.

Copied title and URL