Buscar..


Introducción

Las operaciones bitwise alteran cadenas binarias en el nivel de bit. Estas operaciones son increíblemente básicas y están directamente soportadas por el procesador. Estas pocas operaciones son necesarias para trabajar con controladores de dispositivo, gráficos de bajo nivel, criptografía y comunicaciones de red. Esta sección proporciona conocimientos útiles y ejemplos de operadores bitwise de Python.

Sintaxis

  • x << y # Bitwise Left Shift

  • x >> y # Bitwise Right Shift

  • x & y # Bitwise Y

  • x | y # Bitwise OR

  • ~ x # Bitwise NO

  • x ^ y # Bitwise XOR

Y a nivel de bit

El operador & realizará un AND binario, donde se copia un bit si existe en ambos operandos. Eso 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 o

El | el operador realizará un binario "o", donde se copia un bit si existe en cualquiera de los operandos. Eso 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 de bitwise (OR exclusivo)

El operador ^ realizará un XOR binario en el que se copia un binario 1 si y solo si es el valor de exactamente un operando. Otra forma de afirmar esto es que el resultado es 1 solo si los operandos son diferentes. Ejemplos incluyen:

# 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

Desplazamiento a la izquierda en modo de bits

El operador << realizará un "desplazamiento a la izquierda" a nivel de bits, donde el valor del operando izquierdo se mueve a la izquierda por el número de bits dado por el operando derecho.

# 2 = 0b10
2 << 2
# Out: 8
# 8 = 0b1000

bin(2 << 2)
# Out: 0b1000

Realizar un cambio de bit a la izquierda de 1 es equivalente a la multiplicación por 2 :

7 << 1
# Out: 14

Realizar un cambio de bit a la izquierda de n es equivalente a la multiplicación por 2**n :

3 << 4
# Out: 48

Cambio a la derecha en el modo de bits

El operador >> realizará un "desplazamiento a la derecha" a nivel de bits, donde el valor del operando izquierdo se mueve a la derecha por el número de bits dado por el operando derecho.

# 8 = 0b1000
8 >> 2
# Out: 2
# 2 = 0b10

bin(8 >> 2)
# Out: 0b10

Realizar un cambio de bit a la derecha de 1 es equivalente a la división entera por 2 :

36 >> 1
# Out: 18

15 >> 1
# Out: 7

Realizar un cambio de bit a la derecha de n es equivalente a la división entera por 2**n :

48 >> 4
# Out: 3

59 >> 3
# Out: 7

Bitwise NO

El operador ~ volteará todos los bits en el número. Dado que las computadoras usan representaciones de números firmados , especialmente la notación de complemento de los dos para codificar números binarios negativos donde los números negativos se escriben con un (1) inicial en lugar de un cero (0).

Esto significa que si estuviera usando 8 bits para representar los números del complemento a dos, trataría los patrones de 0000 0000 a 0111 1111 para representar números de 0 a 127 y reservaría 1xxx xxxx para representar números negativos.

Números de ocho bits de complemento a dos

Bits Valor sin firmar Valor del complemento a dos
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

En esencia, esto significa que mientras 1010 0110 tiene un valor sin signo de 166 (se obtiene al agregar (128 * 1) + (64 * 0) + (32 * 1) + (16 * 0) + (8 * 0) + (4 * 1) + (2 * 1) + (1 * 0) ), tiene un valor de complemento a dos de -90 (se obtiene al agregar (128 * 1) - (64 * 0) - (32 * 1) - (16 * 0) - (8 * 0) - (4 * 1) - (2 * 1) - (1 * 0) , y complementando el valor).

De esta manera, los números negativos varían hasta -128 ( 1000 0000 ). Cero (0) se representa como 0000 0000 , y menos uno (-1) como 1111 1111 .

En general, sin embargo, esto 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

Tenga en cuenta que el efecto general de esta operación cuando se aplica a números positivos se puede resumir:

~n -> -|n+1|

Y luego, cuando se aplica a números negativos, el efecto correspondiente es:

~-n -> |n-1|

Los siguientes ejemplos ilustran esta última regla ...

# -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

Operaciones in situ

Todos los operadores de Bitwise (excepto ~ ) tienen sus propias versiones in situ

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
Licenciado bajo CC BY-SA 3.0
No afiliado a Stack Overflow