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


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow