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).