Python bitwise operatoren (logisch product, logische OF, exclusieve OF, inversie, shift)

Bedrijf

Python heeft de volgende bitwise operatoren, die respectievelijk logische conjunctie, logische disjunctie, exclusieve disjunctie, bitwise inversie, linker bit shift, en rechter bit shift uitvoeren op elk bit van een binaire integer waarde van het type int.

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

In dit deel leggen wij eerst het volgende uit.

  • kruispunt (AND) : &
  • loskoppeling (OR) : |
  • EXCLUSIEF-OR operatie (XOR) : ^

Vervolgens zullen we het volgende bespreken.

  • Bitwise operaties op negatieve gehele getallen
  • bit flip ( NOT) : ~
  • bitverschuiving : << , >>

Voor meer informatie over het schrijven van gehele getallen in binair, octaal en hexadecimaal, en het omzetten van binaire, octale en hexadecimale getallen en tekenreeksen met behulp van de volgende functies, zie het volgende artikel.

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

Raadpleeg ook het volgende artikel voor logische bewerkingen (Booleaanse bewerkingen) op booleaanse waarden (waar, onwaar) in plaats van bitwise bewerkingen. Gebruik en,of in plaats van &,|.

kruispunt (AND) : &operator

Dit is een voorbeeld van een logische EN met gebruik van de & operator, met het resultaat geconverteerd naar een string in binaire notatie door bin().

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

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

loskoppeling (OR) : |operator

Een voorbeeld van een logisch product (OR) met gebruik van de | operator, met het resultaat omgezet in een string in binaire notatie door bin() en samen uitgevoerd.

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

EXCLUSIEF-OR operatie (XOR) : ^operator

Voorbeeld van een logisch product (XOR) met behulp van de ^ operator, gecombineerd met het resultaat van de conversie naar een string in binaire notatie met bin().

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

De relatie tussen de input en output voor elk bit van logische AND, OR, en XOR is weergegeven in de onderstaande tabel.

Ingang 1Ingang 2kruispunt (AND)loskoppeling (OR)EXCLUSIEF-OR operatie (XOR)
11110
10011
01011
00000

Bitwise operaties op negatieve gehele getallen

Wanneer een bitwise operatie wordt uitgevoerd op een negatief geheel getal, wordt de waarde verwerkt alsof deze is uitgedrukt in two's complement vorm.

Merk echter op dat als je een negatief geheel getal converteert naar een binaire string met bin() of format(), de absolute waarde een minteken zal hebben in plaats van een two's complement formaat.

Indien u een string wilt verkrijgen met een two's complement voorstelling, neem dan AND met het maximum aantal bit cijfers dat vereist is, zoals hieronder getoond.

  • Voor 4-bit0b1111 (=0xf)
  • Voor 8-bit0xff
  • Voor 16-bit0xffff

Je kunt een string krijgen met een two's complement representatie (elk bit is geïnverteerd en 1 is toegevoegd).

x = -9

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

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

bit flip : ~operator

~exemplaar van bit flipping met operatoren.

Bij bitwise inversie wordt niet gewoon de waarde van elk bit geïnverteerd. De returnwaarde bij gebruik van deze operator is als volgt.
~x=-(x+1)

-(x+1)Deze waarde is gelijk aan het beschouwen van de ingangswaarde x als een tweevoudige vorm en het inverteren van alle bits.

Zoals hierboven vermeld, in Python, wanneer een negatief geheel getal geconverteerd wordt naar een binaire string met bin(), format(), enz., is het niet in two's complement vorm, maar in absolute waarde met een minteken. Daarom zal het direct omzetten van ~x naar een string niet resulteren in een string met de bits van de oorspronkelijke waarde geïnverteerd.

x = 9  # 0b1001

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

Wanneer we de AND-bewerking uitvoeren en omzetten in een string van two's complement voorstelling, kunnen we zien dat de bits van de oorspronkelijke waarde geïnverteerd zijn.

Om bijvoorbeeld een bit string te verkrijgen die een geïnverteerde 4-cijferige bit string is (tekenbit weggelaten), gebruik je format() om de nullen voor de ANDed waarde als volgt in te vullen'04b'

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

bitverschuiving : << , >>

Voorbeelden van bitshift naar links en bitshift naar rechts met behulp van bit-shift operatoren.

x = 9  # 0b1001

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

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

Voor negatieve waarden wordt het tekenbit verlengd en verschoven, en blijft het teken positief-negatief hetzelfde. Een negatieve waarde is een beeld van een rij van 1-en helemaal naar links.

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

Het is beter om te denken in termen van reeksen van two's complement uitdrukkingen, omdat denken in termen van getallen niet duidelijk is.