Python Language
Operatori bit a bit
Ricerca…
introduzione
Le operazioni bit a bit alterano le stringhe binarie a livello di bit. Queste operazioni sono incredibilmente semplici e sono supportate direttamente dal processore. Queste poche operazioni sono necessarie per lavorare con driver di periferica, grafica di basso livello, crittografia e comunicazioni di rete. Questa sezione fornisce utili conoscenze ed esempi degli operatori bit a bit di Python.
Sintassi
x << y # Bitwise Left Shift
x >> y # Bitwise Right Shift
x & y # Bitwise AND
x | y # Bitwise OR
~ x # Bitwise NOT
x ^ y # Bitwise XOR
Bitwise AND
L'operatore &
eseguirà un binario AND , dove viene copiato un bit se esiste in entrambi gli operandi. Questo significa:
# 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
Bitwise OR
Il |
l'operatore eseguirà un binario "o", in cui un bit viene copiato se esiste in entrambi gli operandi. Questo significa:
# 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
XOR bit a bit (OR esclusivo)
L'operatore ^
eseguirà uno XOR binario in cui un binario 1
viene copiato se e solo se è il valore di esattamente un operando. Un altro modo per affermarlo è che il risultato è 1
solo se gli operandi sono diversi. Esempi inclusi:
# 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
Spostamento a sinistra bit a bit
L'operatore <<
eseguirà un "spostamento a sinistra" bit a bit, in cui il valore dell'operando di sinistra viene spostato a sinistra dal numero di bit dati dall'operando di destra.
# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000
bin(2 << 2)
# Out: 0b1000
L'esecuzione di uno spostamento di bit sinistro di 1
equivale alla moltiplicazione per 2
:
7 << 1
# Out: 14
L'esecuzione di uno spostamento di bit sinistro di n
equivale alla moltiplicazione per 2**n
:
3 << 4
# Out: 48
Spostamento a destra bit a bit
L'operatore >>
eseguirà un "spostamento a destra" bit a bit, in cui il valore dell'operando di sinistra viene spostato a destra dal numero di bit forniti dall'operando di destra.
# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10
bin(8 >> 2)
# Out: 0b10
L'esecuzione di uno spostamento di bit a destra di 1
equivale alla divisione di interi per 2
:
36 >> 1
# Out: 18
15 >> 1
# Out: 7
L'esecuzione di uno spostamento di bit a destra di n
equivale alla divisione di interi per 2**n
:
48 >> 4
# Out: 3
59 >> 3
# Out: 7
Bitwise NOT
L'operatore ~
capovolgerà tutti i bit del numero. Poiché i computer usano le rappresentazioni numerate firmate , in particolare la notazione a complemento dei due per codificare i numeri binari negativi dove i numeri negativi sono scritti con uno iniziale (1) invece che uno zero iniziale (0).
Ciò significa che se si utilizzavano 8 bit per rappresentare i numeri del complemento a due, si trattano i pattern da 0000 0000
a 0111 1111
per rappresentare i numeri da 0 a 127 e riservare 1xxx xxxx
per rappresentare i numeri negativi.
Numeri a complemento a otto bit
bits | Valore senza segno | Valore a complemento a due |
---|---|---|
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 sostanza, ciò significa che mentre 1010 0110
ha un valore senza segno di 166 (arrivato aggiungendo (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0)
), ha un valore di complemento a due di -90 (arrivato aggiungendo (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0)
e completano il valore).
In questo modo, i numeri negativi vanno da -128 ( 1000 0000
). Zero (0) è rappresentato come 0000 0000
e meno uno (-1) come 1111 1111
.
In generale, però, questo significa ~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
Nota , l'effetto complessivo di questa operazione quando applicato a numeri positivi può essere riassunto:
~n -> -|n+1|
E poi, se applicato a numeri negativi, l'effetto corrispondente è:
~-n -> |n-1|
I seguenti esempi illustrano questa ultima regola ...
# -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
Operazioni interne
Tutti gli operatori Bitwise (eccetto ~
) hanno le proprie versioni sul posto
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