Python Language
Bitweise Operatoren
Suche…
Einführung
Bitweise Operationen ändern binäre Zeichenfolgen auf Bitebene. Diese Operationen sind unglaublich einfach und werden vom Prozessor direkt unterstützt. Diese wenigen Operationen sind für die Arbeit mit Gerätetreibern, Low-Level-Grafik, Kryptografie und Netzwerkkommunikation erforderlich. Dieser Abschnitt enthält nützliche Kenntnisse und Beispiele für die bitweisen Operatoren von Python.
Syntax
x << y # Bitweise Linksverschiebung
x >> y # Bitweise Rechtsverschiebung
x & y # Bitweise UND
x | y # Bitweise ODER
~ x # Bitweise NICHT
x ^ y # Bitweise XOR
Bitweises AND
Der Operator &
führt ein binäres AND aus , wobei ein Bit kopiert wird, wenn es in beiden Operanden vorhanden ist. Das bedeutet:
# 0 & 0 = 0
# 0 & 1 = 0
# 1 & 0 = 0
# 1 & 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 & 30
# Out: 28
# 28 = 0b11100
bin(60 & 30)
# Out: 0b11100
Bitweises ODER
Die |
Der Operator führt ein binäres "oder" aus, wobei ein Bit kopiert wird, wenn es in einem der Operanden vorhanden ist. Das bedeutet:
# 0 | 0 = 0
# 0 | 1 = 1
# 1 | 0 = 1
# 1 | 1 = 1
# 60 = 0b111100
# 30 = 0b011110
60 | 30
# Out: 62
# 62 = 0b111110
bin(60 | 30)
# Out: 0b111110
Bitweises XOR (exklusives ODER)
Der Operator ^
führt eine binäre XOR aus, in der eine binäre 1
genau dann kopiert wird, wenn es sich um den Wert genau eines Operanden handelt. Eine andere Möglichkeit dies zu sagen ist, dass das Ergebnis nur 1
, wenn die Operanden unterschiedlich sind. Beispiele beinhalten:
# 0 ^ 0 = 0
# 0 ^ 1 = 1
# 1 ^ 0 = 1
# 1 ^ 1 = 0
# 60 = 0b111100
# 30 = 0b011110
60 ^ 30
# Out: 34
# 34 = 0b100010
bin(60 ^ 30)
# Out: 0b100010
Bitweise Linksverschiebung
Der Operator <<
führt eine bitweise "Linksverschiebung" aus, bei der der Wert des linken Operanden um die vom rechten Operanden angegebene Anzahl Bits nach links verschoben wird.
# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000
bin(2 << 2)
# Out: 0b1000
Das Durchführen einer Verschiebung um 1
nach links entspricht der Multiplikation mit 2
:
7 << 1
# Out: 14
Das Durchführen einer Verschiebung des linken Bits um n
entspricht der Multiplikation mit 2**n
:
3 << 4
# Out: 48
Bitweise Rechtsverschiebung
Der Operator >>
führt eine bitweise "Rechtsverschiebung" aus, bei der der Wert des linken Operanden um die vom rechten Operanden angegebene Anzahl von Bits nach rechts verschoben wird.
# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10
bin(8 >> 2)
# Out: 0b10
Das Durchführen einer Verschiebung um 1
nach rechts entspricht der Division von Ganzzahlen durch 2
:
36 >> 1
# Out: 18
15 >> 1
# Out: 7
Das Durchführen einer Verschiebung um n
rechts nach rechts entspricht der ganzzahligen Division um 2**n
:
48 >> 4
# Out: 3
59 >> 3
# Out: 7
Bitweises NICHT
Der Operator ~
dreht alle Bits in der Zahl um. Da Computer vorzeichenbehaftete Zahlendarstellungen verwenden - vor allem die Zweierkomplementschreibweise zur Kodierung negativer Binärzahlen, wobei negative Zahlen mit einer führenden Zahl (1) anstelle einer führenden Null (0) geschrieben werden.
Das bedeutet, wenn Sie 8 Bits für die Darstellung Ihrer Zweierkomplement-Zahlen verwenden, würden Sie Muster von 0000 0000
bis 0111 1111
, dass sie Zahlen von 0 bis 127 darstellen, und 1xxx xxxx
für negative Zahlen.
Acht-Bit-Zwei-Komplement-Zahlen
Bits | Vorzeichenloser Wert | Zwei-Komplementwert |
---|---|---|
0000 0000 | 0 | 0 |
0000 0001 | 1 | 1 |
0000 0010 | 2 | 2 |
0111 1110 | 126 | 126 |
0111 1111 | 127 | 127 |
1000 0000 | 128 | -128 |
1000 0001 | 129 | -127 |
1000 0010 | 130 | -126 |
1111 1110 | 254 | -2 |
1111 1111 | 255 | -1 |
Im Wesentlichen bedeutet dies, dass 1010 0110
einen vorzeichenlosen Wert von 166 hat (durch Hinzufügen von (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
) hat es einen Zweierkomplementwert von -90 (durch Hinzufügen von (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
und den Wert ergänzen).
Auf diese Weise reichen negative Zahlen bis -128 ( 1000 0000
). Null (0) wird als 0000 0000
und minus Eins (-1) als 1111 1111
.
Im Allgemeinen bedeutet dies jedoch ~n = -n - 1
.
# 0 = 0b0000 0000
~0
# Out: -1
# -1 = 0b1111 1111
# 1 = 0b0000 0001
~1
# Out: -2
# -2 = 1111 1110
# 2 = 0b0000 0010
~2
# Out: -3
# -3 = 0b1111 1101
# 123 = 0b0111 1011
~123
# Out: -124
# -124 = 0b1000 0100
Beachten Sie , dass die Gesamtwirkung dieses Vorgangs bei Anwendung auf positive Zahlen zusammengefasst werden kann:
~n -> -|n+1|
Bei einer Anwendung auf negative Zahlen lautet der entsprechende Effekt:
~-n -> |n-1|
Die folgenden Beispiele veranschaulichen diese letzte Regel ...
# -0 = 0b0000 0000
~-0
# Out: -1
# -1 = 0b1111 1111
# 0 is the obvious exception to this rule, as -0 == 0 always
# -1 = 0b1000 0001
~-1
# Out: 0
# 0 = 0b0000 0000
# -2 = 0b1111 1110
~-2
# Out: 1
# 1 = 0b0000 0001
# -123 = 0b1111 1011
~-123
# Out: 122
# 122 = 0b0111 1010
Inplace-Operationen
Alle Bitwise-Operatoren (außer ~
) verfügen über eine eigene Version
a = 0b001
a &= 0b010
# a = 0b000
a = 0b001
a |= 0b010
# a = 0b011
a = 0b001
a <<= 2
# a = 0b100
a = 0b100
a >>= 2
# a = 0b001
a = 0b101
a ^= 0b011
# a = 0b110