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


Modified text is an extract of the original Stack Overflow Documentation
Licentie onder CC BY-SA 3.0
Niet aangesloten bij Stack Overflow