Bitweise Python-Operatoren (logisches Produkt, logisches ODER, exklusives ODER, Inversion, Verschiebung)

Geschäft

Python bietet die folgenden bitweisen Operatoren, die die logische Konjunktion, die logische Disjunktion, die exklusive Disjunktion, die bitweise Inversion, die Linksverschiebung und die Rechtsverschiebung für jedes Bit eines binären Ganzzahlwertes vom Typ int ausführen.

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

In diesem Abschnitt wird zunächst das Folgende erläutert.

  • Kreuzung (AND) : &
  • Disjunktion (OR) : |
  • EXKLUSIV-OR-Verknüpfung (XOR) : ^

Als Nächstes werden wir die folgenden Punkte erörtern.

  • Bitweise Operationen für negative ganze Zahlen
  • Bitflip ( NOT) : ~
  • Bitverschiebung : << , >>

Weitere Informationen zum Schreiben von Ganzzahlen in Binär-, Oktal- und Hexadezimalform und zur Konvertierung von Binär-, Oktal- und Hexadezimalzahlen und -zeichenketten mithilfe der folgenden Funktionen finden Sie im folgenden Artikel.

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

Für logische Operationen (boolesche Operationen) mit booleschen Werten (wahr, falsch) anstelle von bitweisen Operationen siehe auch den folgenden Artikel. Verwenden Sie and,or anstelle von &,|.

Kreuzung (AND) : &Betreiber

Dies ist ein Beispiel für eine logische UND-Verknüpfung mit dem Operator &, wobei das Ergebnis mit bin() in eine Zeichenkette in binärer Schreibweise umgewandelt wird.

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

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

Disjunktion (OR) : |Betreiber

Ein Beispiel für ein logisches Produkt (ODER) unter Verwendung des Operators |, wobei das Ergebnis mit bin() in eine Zeichenkette in binärer Schreibweise umgewandelt und zusammen ausgegeben wird.

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

EXKLUSIV-OR-Verknüpfung (XOR) : ^Betreiber

Beispiel für ein logisches Produkt (XOR) mit dem Operator ^, kombiniert mit dem Ergebnis der Umwandlung in eine Zeichenkette in binärer Schreibweise mit bin().

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

Die Beziehung zwischen dem Eingang und dem Ausgang für jedes Bit von logischem UND, ODER und XOR ist in der folgenden Tabelle dargestellt.

Eingang 1Eingang 2Kreuzung (AND)Disjunktion (OR)EXKLUSIV-OR-Verknüpfung (XOR)
11110
10011
01011
00000

Bitweise Operationen für negative ganze Zahlen

Wenn eine bitweise Operation an einer negativen ganzen Zahl durchgeführt wird, wird der Wert so verarbeitet, als ob er im Zweierkomplement ausgedrückt wäre.

Beachten Sie jedoch, dass bei der Umwandlung einer negativen Ganzzahl in eine binäre Zeichenkette mit bin() oder format() der Absolutwert ein Minuszeichen anstelle des Zweierkomplements hat.

Wenn Sie eine Zeichenkette mit Zweierkomplement-Darstellung erhalten möchten, nehmen Sie AND mit der maximal erforderlichen Anzahl von Bit-Stellen, wie unten gezeigt.

  • Für 4-Bit0b1111 (=0xf)
  • Für 8-Bit0xff
  • Für 16-Bit0xffff

Sie können eine Zeichenfolge in Zweierkomplement-Darstellung erhalten (jedes Bit wird invertiert und 1 hinzugefügt).

x = -9

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

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

Bitflip : ~Betreiber

~Beispiel für Bitflipping mit Operatoren.

Bei der bitweisen Inversion wird nicht einfach der Wert jedes Bits invertiert. Der Rückgabewert bei Verwendung dieses Operators ist wie folgt.
~x=-(x+1)

-(x+1)Dieser Wert ist gleichbedeutend mit der Betrachtung des Eingangswertes x als Zweierkomplement und der Invertierung aller Bits.

Wie bereits erwähnt, wird in Python eine negative ganze Zahl bei der Umwandlung in eine binäre Zeichenkette mit bin(), format() usw. nicht im Zweierkomplement, sondern als absoluter Wert mit einem Minuszeichen dargestellt. Daher führt die direkte Umwandlung von ~x in eine Zeichenkette nicht zu einer Zeichenkette, bei der die Bits des ursprünglichen Wertes invertiert sind.

x = 9  # 0b1001

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

Wenn wir die UND-Verknüpfung durchführen und sie in eine Folge von Zweierkomplement-Darstellungen umwandeln, können wir sehen, dass die Bits des ursprünglichen Wertes invertiert sind.

Um zum Beispiel eine 4-stellige Bitfolge zu erhalten, die invertiert ist (ohne Vorzeichen), verwenden Sie format(), um die Nullen für den UND-verknüpften Wert wie folgt einzufügen'04b'

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

Bitverschiebung : << , >>

Beispiele für die Verschiebung von Bits nach links und rechts mit Hilfe von Bitverschiebungsoperatoren.

x = 9  # 0b1001

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

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

Bei negativen Werten wird das Vorzeichenbit erweitert und verschoben, und das Vorzeichen bleibt gleich. Ein negativer Wert ist ein Bild einer Reihe von 1en ganz 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

Es ist besser, in Form von Reihen von Zweierkomplementausdrücken zu denken, da das Denken in Zahlen nicht klar ist.

Copied title and URL