Python bitaskipt rekstraraðilar (rökrétt vara, rökrétt EÐA, eingöngu EÐA, snúningur, vakt)

Viðskipti

Python býður upp á eftirfarandi bitaaðgerðir, sem framkvæma rökræna samtengingu, röklega sundrun, einkasundrun, bitabreytingu, vinstri bitaskiptingu og hægri bitaskiptingu á hvern bita af int gildi tvöfaldrar heiltölutegundar, í sömu röð.

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

Í þessum kafla útskýrum við fyrst eftirfarandi.

  • gatnamót(AND) :&
  • sundurliðun(OR) :|
  • EXCLUSIVE-OR rekstur(XOR) :^

Næst munum við ræða eftirfarandi.

  • Bitvisar aðgerðir á neikvæðum heiltölum
  • smá flipp( NOT) :~
  • bitaskipti:<<,>>

Fyrir frekari upplýsingar um hvernig á að skrifa heilar tölur í tvíundir, áttund og sextán, og hvernig á að umbreyta tvíundir, áttund og sextán tölur og strengi með því að nota eftirfarandi aðgerðir, sjá eftirfarandi grein.

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

Einnig, fyrir rökréttar aðgerðir (Boolean-aðgerðir) á Boole-gildum (satt, ósatt) í stað bitaaðgerða, vísa til eftirfarandi greinar. Notaðu og,eða í staðinn fyrir &,|.

gatnamót(AND) :&rekstraraðili

Þetta er dæmi um rökrétt OG með því að nota & rekstraraðila, þar sem niðurstöðunni er breytt í streng í tvíundarskrift með bin().

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

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

sundurliðun(OR) :|rekstraraðili

Dæmi um rökræna vöru (OR) sem notar | rekstraraðila, með niðurstöðunni umbreytt í streng í tvíundarskrift með bin() og úttak saman.

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

EXCLUSIVE-OR rekstur(XOR) :^rekstraraðili

Dæmi um rökræna afurð (XOR) sem notar ^ rekstraraðila, ásamt niðurstöðu umbreytingar í streng í tvíundarmerkingu með bin().

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

Sambandið milli inntaks og úttaks fyrir hvern bita af rökrænum OG, EÐA og XOR er sýnt í töflunni hér að neðan.

Inntak 1Inntak 2gatnamót(AND)sundurliðun(OR)EXCLUSIVE-OR rekstur(XOR)
11110
10011
01011
00000

Bitvisar aðgerðir á neikvæðum heiltölum

Þegar bitaaðgerð er framkvæmd á neikvæðri heiltölu, er gildið unnið eins og það væri gefið upp í tvöföldu formi.

Athugaðu hins vegar að ef þú breytir neikvæðri heiltölu í tvíundarstreng með því að nota bin() eða format(), mun algildið hafa mínusmerki í stað tveggja viðbótarsniðs.

Ef þú vilt fá streng með tvíhliða framsetningu, taktu AND með hámarksfjölda bitastafa sem krafist er, eins og sýnt er hér að neðan.

  • Fyrir 4-bita0b1111(=0xf)
  • Fyrir 8-bita0xff
  • Fyrir 16 bita0xffff

Þú getur fengið streng með samhljóðaframsetningu tveggja (hver bita er snúið við og 1 bætt við).

x = -9

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

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

smá flipp:~rekstraraðili

~dæmi um bitaflipping með rekstraraðila.

Bita snúningur er ekki einfaldlega gildi hvers bita sem er snúið við. Skilagildið þegar þessi rekstraraðili er notaður er sem hér segir.
~x#ERROR!-(x+1)

-(x+1)Þetta gildi jafngildir því að líta á inntaksgildið x sem tveggja viðbótarform og snúa öllum bitunum við.

Eins og nefnt er hér að ofan, í Python, þegar neikvæðri heiltölu er breytt í tvíundarstreng með því að nota bin(), snið() o.s.frv., þá er hún ekki á formi tveggja, heldur í algildi með mínusmerki. Þess vegna mun það að breyta ~x beint í streng ekki leiða til strengs með bitum upprunalega gildisins snúið við.

x = 9  # 0b1001

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

Þegar við framkvæmum AND aðgerðina og breytum henni í streng með samhljóðaframsetningu tveggja, getum við séð að bitum upprunalega gildisins er snúið við.

Að auki, til dæmis, til að fá bitastreng sem er 4 stafa bitastrengur sem er snúinn eins og hann er (táknbiti sleppt), notaðu format() til að fylla út núllin fyrir ANDed gildið sem hér segir04b'

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

bitaskipti:<<,>>

Dæmi um vinstri bitaskiptingu og hægri bitaskiptingu með því að nota bitaskiptingu.

x = 9  # 0b1001

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

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

Fyrir neikvæð gildi er táknbitinn framlengdur og færður og jákvætt/neikvætt táknið helst það sama. Neikvætt gildi er mynd af línu 1s alla leið til vinstri.

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

Það er betra að hugsa út frá strengjum sambótarsagna tveggja, þar sem hugsun út frá tölum er ekki skýr.