Python Language
Bitwise Operators
Zoeken…
Invoering
Met bitsgewijze bewerkingen worden binaire tekenreeksen op bitniveau gewijzigd. Deze bewerkingen zijn ongelooflijk eenvoudig en worden rechtstreeks ondersteund door de processor. Deze paar bewerkingen zijn nodig bij het werken met apparaatstuurprogramma's, grafische afbeeldingen op laag niveau, cryptografie en netwerkcommunicatie. Deze sectie biedt nuttige kennis en voorbeelden van bitsgewijze operatoren van Python.
Syntaxis
x << y # Bitwise Left Shift
x >> y # Bitwise Right Shift
x & y # Bitwise AND
x | y # Bitwise OF
~ x # Bitwise NIET
x ^ y # Bitwise XOR
Bitwise AND
De operator &
voert een binaire AND uit , waarbij een bit wordt gekopieerd als het in beide operanden voorkomt. Dat betekent:
# 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
Bitgewijs OF
De |
operator voert een binaire "of" uit, waarbij een bit wordt gekopieerd als het in beide operand voorkomt. Dat betekent:
# 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
Bitwise XOR (exclusief OF)
De operator ^
voert een binaire XOR uit waarin een binaire 1
wordt gekopieerd als en alleen als het de waarde is van exact één operand. Een andere manier om dit te zeggen is dat het resultaat alleen 1
is als de operanden verschillen. Voorbeelden hiervan zijn:
# 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
Bitwise Left Shift
De operator <<
voert een bitgewijze "linkerschuiving" uit, waarbij de waarde van de linkeroperand naar links wordt verplaatst met het aantal bits dat door de rechteroperand wordt gegeven.
# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000
bin(2 << 2)
# Out: 0b1000
Het uitvoeren van een linker bitverschuiving van 1
is equivalent aan vermenigvuldiging met 2
:
7 << 1
# Out: 14
Het uitvoeren van een linker bitverschuiving van n
is gelijk aan vermenigvuldiging met 2**n
:
3 << 4
# Out: 48
Bitwise Right Shift
De operator >>
voert een bitgewijze "rechterschuiving" uit, waarbij de waarde van de linkeroperand naar rechts wordt verplaatst met het aantal bits dat door de rechteroperand wordt gegeven.
# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10
bin(8 >> 2)
# Out: 0b10
Het uitvoeren van een juiste bitverschuiving van 1
is gelijk aan een gehele deling door 2
:
36 >> 1
# Out: 18
15 >> 1
# Out: 7
Het uitvoeren van een juiste bitverschuiving van n
is gelijk aan een gehele deling door 2**n
:
48 >> 4
# Out: 3
59 >> 3
# Out: 7
Bitwise NIET
De ~
operator draait alle bits in het nummer om. Omdat computers ondertekende nummerrepresentaties gebruiken - met name de complementaire notatie van de twee om negatieve binaire getallen te coderen waarbij negatieve getallen worden geschreven met een voorloopnummer (1) in plaats van een voorloopnul (0).
Dit betekent dat als u 8 bits zou gebruiken om uw twee-complement nummers te vertegenwoordigen, u patronen van 0000 0000
tot 0111 1111
zou behandelen om getallen van 0 tot 127 te vertegenwoordigen en 1xxx xxxx
reserveert om negatieve getallen weer te geven.
Acht-bit twee-complement nummers
Bits | Niet-ondertekende waarde | Twee-complement waarde |
---|---|---|
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 |
In wezen betekent dit dat terwijl 1010 0110
een niet-ondertekende waarde van 166 heeft (bereikt door toevoeging van (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
), het heeft een twee-complementwaarde van -90 (bereikt door toevoeging van (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
, en een aanvulling op de waarde).
Op deze manier variëren negatieve getallen tot -128 ( 1000 0000
). Nul (0) wordt weergegeven als 0000 0000
en min één (-1) als 1111 1111
.
Over het algemeen betekent dit echter ~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
Merk op dat het totale effect van deze bewerking bij toepassing op positieve getallen kan worden samengevat:
~n -> -|n+1|
En dan, wanneer toegepast op negatieve getallen, is het overeenkomstige effect:
~-n -> |n-1|
De volgende voorbeelden illustreren deze laatste 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
In-situ bewerkingen
Alle Bitwise-operators (behalve ~
) hebben hun eigen in-place versies
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