Apuntes sobre Operadores Bit a Bit en C
Introducción a los Operadores Bit a Bit
Los operadores bit a bit en C permiten manipular los patrones de bits de los valores enteros a nivel binario, en contraste con los operadores aritméticos que operan sobre números completos. Estos operadores son esenciales en programación de bajo nivel, como en la explotación de binarios, donde es crucial entender la representación binaria de los enteros.
Ejemplo de Representación
| Formato | Valor Impreso | |———-|———————–| | HEX | 0x41414141 | | DECIMAL | 1094795585 | | BINARY | 01000001010000010100000101000001 |
Operador OR Bit a Bit
El operador OR bit a bit (|
) combina los bits de dos operandos, estableciendo un 1
en el resultado si al menos uno de los bits correspondientes en los operandos es 1
.
Ejemplo
unsigned int op1 = 0x41414141;
unsigned int op2 = 0x42424242;
unsigned int result = op1 | op2; // result = 0x43434343
Representación Binaria
| Nombre | Hex | Binario | |——–|————|———————————-| | op1 | 0x41414141 | 01000001010000010100000101000001 | | op2 | 0x42424242 | 01000010010000100100001001000010 | | result | 0x43434343 | 01000011010000110100001101000011 |
Operador AND Bit a Bit
El operador AND bit a bit (&
) preserva solo los bits 1
que están presentes en ambos operandos.
Ejemplo
unsigned int op1 = 0x41414141;
unsigned int op2 = 0x42424242;
unsigned int result = op1 & op2; // result = 0x40404040
Representación Binaria
| Nombre | Hex | Binario | |——–|————|———————————-| | op1 | 0x41414141 | 01000001010000010100000101000001 | | op2 | 0x42424242 | 01000010010000100100001001000010 | | result | 0x40404040 | 01000000010000000100000001000000 |
Uso común: Este operador se utiliza frecuentemente para enmascarar bits, eliminando bits no deseados.
Operador XOR Bit a Bit
El operador XOR bit a bit (^
) establece un bit 1
en el resultado solo si exactamente uno de los bits correspondientes en los operandos es 1
. Es común en funciones criptográficas.
Ejemplo
unsigned int op1 = 0x41414141;
unsigned int op2 = 0x42424242;
unsigned int result = op1 ^ op2; // result = 0x03030303
Representación Binaria
| Nombre | Hex | Binario | |——–|————|———————————-| | op1 | 0x41414141 | 01000001010000010100000101000001 | | op2 | 0x42424242 | 01000010010000100100001001000010 | | result | 0x03030303 | 00000011000000110000001100000011 |
Operador NOT Bit a Bit
El operador NOT bit a bit (~
) invierte todos los bits de un operando, convirtiendo los 1
en 0
y viceversa.
Ejemplo
unsigned int op1 = 0x41414141;
unsigned int result = ~op1; // result = 0xBEBEBEBE
Representación Binaria
| Nombre | Hex | Binario | |——–|————|———————————-| | op1 | 0x41414141 | 01000001010000010100000101000001 | | result | 0xBEBEBEBE | 10111110101111101011111010111110 |
Desplazamiento a la Izquierda (Shift Left)
El operador de desplazamiento a la izquierda (<<
) mueve los bits de un entero hacia la izquierda, rellenando con ceros los bits vacíos a la derecha.
Ejemplo
unsigned int op1 = 0x41414141;
unsigned int op2 = 8;
unsigned int result = op1 << op2;
Ejemplo Visual (con 0x0000FFFF)
| Nombre | Hex | Binario | |——–|————|———————————-| | op1 | 0x0000FFFF | 00000000000000001111111111111111 | | op2 | 0x00000008 | 00000000000000000000000000001000 | | result | 0x00FFFF00 | 00000000111111111111111100000000 |
Desplazamiento a la Derecha (Shift Right)
El operador de desplazamiento a la derecha (>>
) mueve los bits de un entero hacia la derecha, rellenando los bits vacíos a la izquierda (con ceros para enteros sin signo).
Ejemplo
unsigned int op1 = 0x41414141;
unsigned int op2 = 8;
unsigned int result = op1 >> op2;
Ejemplo Visual (con 0xFFFF0000)
| Nombre | Hex | Binario | |——–|————|———————————-| | op1 | 0xFFFF0000 | 11111111111111110000000000000000 | | op2 | 0x00000008 | 00000000000000000000000000001000 | | result | 0x00FFFF00 | 00000000111111111111111100000000 |
Conclusión
Los operadores bit a bit (|
, &
, ^
, ~
, <<
, >>
) son herramientas poderosas para manipular los bits de los enteros en C. Su comprensión es crucial en entornos de bajo nivel, como la explotación de binarios, donde el control preciso de los bits puede ser necesario para tareas como enmascaramiento, cifrado o manipulación de datos a nivel binario.