Python operadores de bits

por | 15 abril, 2020

Son operadores bit a bit  que se utilizan para comparar números (en binarios):

Operador Nonbre Descripción
AND Establece cada bit en 1 si ambos bits son 1
| OR Establece cada bit en 1 si uno de los dos bits es 1
 ^ XOR Establece cada bit en 1 si solo uno de dos bits es 1
NOT Invierte todos los bits
<<  Zero fill left shift Desplaza los bits hacia la izquierda introduciendo ceros desde la derecha y descarta los bits más a la izquierda
>>  Signed right shift Desplaza bitsa la derecha empujando copias del bit más a la izquierda desde la izquierda, y descarta los bits más a la derecha
Binario Hexadecimal Decimal
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 A 10
1011 B 11
1100 C 12
1101 D 13
1110 E 14
1111 F 15

Como vemos un dígito hexadecimal se representa por 4 bits que pueden ir de 0000 a 1111.

Así pues un byte (8 bits) se representa por dos dígitos hexadecimales de van de 00 a FF

Big endian & Little endian

Consideremos un número exadecimal de 4 bytes:  0x12 34 56 78.

En Big Endian su orden es el natural: dígito más significativo a la izquierda:

En Little Endian el orden de bytes se invierte:

Big Endian: 0x12345678
Little Endian: 0x78563412

Si x es un conjunto de 4 bytes, para cambiarlo de un modo a otro en Python:

def swap32(x):

    return (((x << 24) & 0xFF000000) |

            ((x <<  8) & 0x00FF0000) |

            ((x >>  8) & 0x0000FF00) |

            ((x >> 24) & 0x000000FF))

Explicación:

Supondremos x= 2A BF 07 C1 (0010 1010 1011 1111 0000 0111 1100 0001) x << 24     –>  C1 00 00 00

C1 00 00 00 & 0xFF000000 = C1 00 00 00 (en realidad esta AND no haría falta hacerlo ya que la operación << siempre introduce ceros por la izquierda y estamos desplazando el último byte de la derecha  hasta la esquina izquierda)

x <<  8     –>  BF 07 C1 00

BF 07 C1 00 & 0x00FF0000 = 00 07 00 00

x >>  8     –> 00 2A BF 07

00 2A BF 07 & 0x0000FF00 = 00 00 BF 00

 x >> 24     –> 00 00 00 2A

00 00 00 2A & 00 00 00 FF = 00 00 00 FF (aunque estemos desplazando el último byte de la izquierda a la derecha este AND sí es necesario porque lo que se inserta por la izquierda es el primer bit que haya a la izquierda que puede ser cero o uno, en este ejemplo es cero).

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *