Python indeholder følgende bitvise operatorer, som udfører henholdsvis logisk konjunktion, logisk disjunktion, eksklusiv disjunktion, bitvis inversion, venstre bitskifte og højre bitskifte på hver bit i en binær integerværdi af typen int.
&
|
^
~
<<
>>
I dette afsnit forklarer vi først følgende.
- kryds (AND) :
&
- adskillelse (OR) :
|
- EXCLUSIVE-OR-operation (XOR) :
^
Dernæst vil vi drøfte følgende.
- Bitvise operationer på negative hele tal
- bit flip ( NOT) :
~
- bitskifte :
<<
,>>
Du kan finde flere oplysninger om, hvordan du skriver hele tal i binær, oktal og hexadecimal, og hvordan du konverterer binære, oktale og hexadecimale tal og strenge ved hjælp af de følgende funktioner, i følgende artikel.
bin()
oct()
hex()
format()
- Relaterede artikler:Konverter binære, oktale og hexadecimale tal og strenge til og fra hinanden i Python
For logiske operationer (boolske operationer) på boolske værdier (sandt, falsk) i stedet for bitvise operationer henvises til følgende artikel. Brug og,eller i stedet for &,|.
- Relaterede artikler:Pythons logiske operatorer og, eller, eller og ikke (logisk konjunktion, disjunktion, negation)
kryds (AND) : &operatør
Dette er et eksempel på en logisk AND med operatoren &, hvor resultatet er konverteret til en string i binær notation med bin().
x = 9 # 0b1001 y = 10 # 0b1010 print(x & y) print(bin(x & y)) # 8 # 0b1000
adskillelse (OR) : |operatør
Et eksempel på et logisk produkt (OR) ved hjælp af operatoren |, hvor resultatet konverteres til en streng i binær notation ved bin() og output sammen.
print(x | y) print(bin(x | y)) # 11 # 0b1011
EXCLUSIVE-OR-operation (XOR) : ^operatør
Eksempel på et logisk produkt (XOR) ved hjælp af ^-operatoren, kombineret med resultatet af konverteringen til en streng i binær notation ved hjælp af bin().
print(x ^ y) print(bin(x ^ y)) # 3 # 0b11
Forholdet mellem input og output for hver bit af logisk AND, OR og XOR er vist i nedenstående tabel.
Indgang 1 | Indgang 2 | kryds (AND) | adskillelse (OR) | EXCLUSIVE-OR-operation (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
Bitvise operationer på negative hele tal
Når der udføres en bitvis operation på et negativt heltal, behandles værdien, som om den var udtrykt i tokomplementform.
Bemærk dog, at hvis du konverterer et negativt heltal til en binær streng ved hjælp af bin() eller format(), vil den absolutte værdi have et minustegn i stedet for et tokomplementformat.
Hvis du vil have en streng med tokomplementrepræsentation, skal du vælge AND med det maksimale antal bitcifre, som er påkrævet, som vist nedenfor.
- For 4-bit
0b1111
(=0xf
) - For 8-bit
0xff
- For 16-bit
0xffff
Du kan få en streng af tokomplementrepræsentation (hver bit er inverteret og 1 er tilføjet).
x = -9 print(x) print(bin(x)) # -9 # -0b1001 print(bin(x & 0xff)) print(format(x & 0xffff, 'x')) # 0b11110111 # fff7
- Relaterede artikler:Konverter binære, oktale og hexadecimale tal og strenge til og fra hinanden i Python
bit flip : ~operatør
~Eksempel på bit flipping med operatører.
Bitvis inversion er ikke blot værdien af hver bit, der er inverteret. Returværdien ved brug af denne operatør er som følger.~x
=-(x+1)
-(x+1)
Denne værdi svarer til at betragte inputværdien x som et tokomplement og invertere alle bits.
Som nævnt ovenfor er et negativt heltal i Python, når det konverteres til en binær streng ved hjælp af bin(), format() osv., ikke i tokomplementform, men i absolut værdi med et minustegn. Derfor vil en konvertering af ~x direkte til en streng ikke resultere i en streng med inverterede bits i den oprindelige værdi.
x = 9 # 0b1001 print(~x) print(bin(~x)) # -10 # -0b1010
Når vi udfører AND-operationen og omdanner den til en streng af tokomplementrepræsentation, kan vi se, at bitsene i den oprindelige værdi er inverteret.
Hvis du f.eks. vil få en bitstreng, der er en 4-cifret bitstreng inverteret som den er (tegnbit udeladt), skal du bruge format() til at udfylde nuller for den ANDede værdi på følgende måde'04b'
print(bin(~x & 0xff)) print(format(~x & 0b1111, '04b')) # 0b11110110 # 0110
bitskifte : << , >>
Eksempler på venstre bitskifte og højre bitskifte ved hjælp af bitskifteoperatorer.
x = 9 # 0b1001 print(x << 1) print(bin(x << 1)) # 18 # 0b10010 print(x >> 1) print(bin(x >> 1)) # 4 # 0b100
For negative værdier udvides og forskydes fortegnsbitten, og det positive\negative fortegn forbliver det samme. En negativ værdi er et billede af en linje af 1'ere helt til venstre.
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 er bedre at tænke i strenge af tokomplementudtryk, da det ikke er klart at tænke i tal.