Python bitvisa operatörer (logisk produkt, logisk OR, exklusiv OR, inversion, shift)

Företag

Python tillhandahåller följande bitvisa operatörer som utför logisk konjunktion, logisk disjunktion, exklusiv disjunktion, bitvis inversion, vänster bitförskjutning och höger bitförskjutning på varje bit i ett binärt heltal av typen int-värde.

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

I det här avsnittet förklarar vi först följande.

  • korsning (AND) : &
  • disjunktion (OR) : |
  • EXKLUSIVE-OR-operation (XOR) : ^

Därefter kommer vi att diskutera följande.

  • Bitvisa operationer på negativa heltal
  • bitflip ( NOT) : ~
  • bitförskjutning : << , >>

Mer information om hur du skriver heltal i binära, oktala och hexadecimala tal och hur du konverterar binära, oktala och hexadecimala tal och strängar med hjälp av följande funktioner finns i följande artikel.

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

För logiska operationer (boolska operationer) på boolska värden (sant, falskt) i stället för bitvisa operationer, se följande artikel. Använd and,or i stället för &,|.

korsning (AND) : &operatör

Detta är ett exempel på ett logiskt AND med operatorn &, där resultatet konverteras till en sträng i binär notation med bin().

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

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

disjunktion (OR) : |operatör

Ett exempel på en logisk produkt (OR) med operatorn |, där resultatet konverteras till en sträng i binär notation med bin() och skrivs ut tillsammans.

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

EXKLUSIVE-OR-operation (XOR) : ^operatör

Exempel på en logisk produkt (XOR) med hjälp av operatorn ^, kombinerat med resultatet av konverteringen till en sträng i binär notation med bin().

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

Förhållandet mellan ingång och utgång för varje bit av logiska AND, OR och XOR visas i tabellen nedan.

Ingång 1Inmatning 2korsning (AND)disjunktion (OR)EXKLUSIVE-OR-operation (XOR)
11110
10011
01011
00000

Bitvisa operationer på negativa heltal

När en bitvis operation utförs på ett negativt heltal behandlas värdet som om det vore uttryckt i tvåkomplementsform.

Observera dock att om du konverterar ett negativt heltal till en binär sträng med bin() eller format() kommer det absoluta värdet att ha ett minustecken i stället för ett tvåkomplementsformat.

Om du vill få fram en sträng med tvåkomplementsrepresentation, ta AND med det maximala antalet bitsiffror som krävs, enligt nedan.

  • För 4-bitars0b1111 (=0xf)
  • För 8-bitars0xff
  • För 16-bitars0xffff

Du kan få en sträng med tvåkomplementsrepresentation (varje bit är inverterad och 1 läggs till).

x = -9

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

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

bitflip : ~operatör

~exempel på bitflipping med operatörer.

Bitvis inversion är inte bara värdet av varje inverterad bit. Returvärdet vid användning av denna operatör är följande.
~x=-(x+1)

-(x+1)Detta värde är likvärdigt med att betrakta ingångsvärdet x som ett tvåkomplement och invertera alla bitar.

Som nämnts ovan är ett negativt heltal i Python, när det konverteras till en binär sträng med bin(), format() etc., inte i form av tvåkomplement, utan i absolut värde med ett minustecken. Om ~x konverteras direkt till en sträng kommer därför inte att resultera i en sträng med inverterade bitar av det ursprungliga värdet.

x = 9  # 0b1001

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

När vi utför AND-operationen och omvandlar den till en sträng av tvåkomplementsrepresentation kan vi se att bitarna i det ursprungliga värdet är inverterade.

Om du till exempel vill få en bitsträng som är en 4-siffrig bitsträng inverterad som den är (teckenbiten utelämnas), använd format() för att fylla i nollorna för det ANDade värdet på följande sätt'04b'

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

bitförskjutning : << , >>

Exempel på vänster bitförskjutning och höger bitförskjutning med hjälp av bitförskjutningsoperatorer.

x = 9  # 0b1001

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

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

För negativa värden förlängs och förskjuts teckenbiten, och det positiva\negativa tecknet förblir detsamma. Ett negativt värde är en bild av en rad med 1:or hela vägen till vänster.

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

Det är bättre att tänka i termer av strängar av tvåkomplementsuttryck, eftersom det är svårt att tänka i termer av tal.

Copied title and URL