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


Modified text is an extract of the original Stack Overflow Documentation
Lizenziert unter CC BY-SA 3.0
Nicht angeschlossen an Stack Overflow