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()
- Relaterade artiklar:Konvertera binära, oktala och hexadecimala tal och strängar till och från varandra i Python
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 &,|.
- Relaterade artiklar:Pythons logiska operatorer och, eller och inte (logisk konjunktion, disjunktion, negation).
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 1 | Inmatning 2 | korsning (AND) | disjunktion (OR) | EXKLUSIVE-OR-operation (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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-bitars
0b1111
(=0xf
) - För 8-bitars
0xff
- För 16-bitars
0xffff
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
- Relaterade artiklar:Konvertera binära, oktala och hexadecimala tal och strängar till och från varandra i Python
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.