Python bitvise operatorer (logisk produkt, logisk OR, eksklusiv OR, inversion, skift)

Forretning

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()

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 &,|.

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 1Indgang 2kryds (AND)adskillelse (OR)EXCLUSIVE-OR-operation (XOR)
11110
10011
01011
00000

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-bit0b1111 (=0xf)
  • For 8-bit0xff
  • For 16-bit0xffff

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

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.

Copied title and URL