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()
- Verwandte Artikel:Konvertieren von binären, oktalen und hexadezimalen Zahlen und Zeichenketten in Python ineinander und auseinander
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 &,|.
- Verwandte Artikel:Pythons logische Operatoren und, oder, und nicht (logische Konjunktion, Disjunktion, Negation)
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 1 | Eingang 2 | Kreuzung (AND) | Disjunktion (OR) | EXKLUSIV-OR-Verknüpfung (XOR) |
---|---|---|---|---|
1 | 1 | 1 | 1 | 0 |
1 | 0 | 0 | 1 | 1 |
0 | 1 | 0 | 1 | 1 |
0 | 0 | 0 | 0 | 0 |
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-Bit
0b1111
(=0xf
) - Für 8-Bit
0xff
- Für 16-Bit
0xffff
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
- Verwandte Artikel:Konvertieren von binären, oktalen und hexadezimalen Zahlen und Zeichenketten in Python ineinander und auseinander
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.