Los operadores de bits y bytes en C++ permiten manipular datos a nivel de bits individuales o grupos de bits en una variable.
A diferencia de los operadores aritméticos comunes, que operan sobre valores completos, los operadores de bit manipulan cada bit en la representación binaria de un número.
C++ proporciona varios operadores bitwise, cada uno con su propia funcionalidad específica. Aquí tenéis una tabla de resumen.
Operador | Descripcion |
---|---|
& | AND a nivel bit |
| | OR a nivel bit |
^ | XOR a nivel bit |
~ | Not a nivel bit |
<< | Desplazamiento a izquierda |
>> | Desplazamiento a derecha |
Tipos de operadores bitwise en C++
Operador AND (&
)
El operador AND bitwise realiza una operación lógica AND entre cada par de bits correspondientes de dos operandos. El resultado es 1
solo si ambos bits son 1
, de lo contrario el resultado es 0
.
int a = 6; // Binario: 00000110
int b = 3; // Binario: 00000011
int result = a & b; // Binario: 00000010 (solo los bits comunes)
En este ejemplo, la operación a & b
compara cada bit en los números a
y b
. Solo el tercer bit de la derecha es 1
en ambos, por lo que el resultado es 00000010
, que equivale a 2
en decimal.
Operador OR (|
)
El operador OR bitwise realiza una operación lógica OR entre cada par de bits correspondientes de dos operandos. El resultado es 1
si al menos uno de los bits es 1
, de lo contrario el resultado es 0
.
int a = 6; // Binario: 00000110
int b = 3; // Binario: 00000011
int result = a | b; // Binario: 00000111 (si algún bit es 1)
Aquí, la operación a | b
establece cada bit en 1
si al menos uno de los bits correspondientes en a
o b
es 1
. El resultado es 00000111
, que es 7
en decimal.
Operador XOR (^
)
int a = 6; // Binario: 00000110
int b = 3; // Binario: 00000011
int result = a ^ b; // Binario: 00000101 (solo si los bits son diferentes)
}
En este caso, a ^ b
devuelve 1
solo si los bits correspondientes en a
y b
son diferentes. El resultado 00000101
equivale a 5
.
Operador NOT (~
)
El operador NOT bitwise realiza una negación bitwise de su operando, invirtiendo cada bit del operando (los 0
se convierten en 1
y viceversa).
int a = 6; // Binario: 00000110
int result = ~a; // Binario: 11111001 en una representación de 8 bits
}
Desplazamiento a la Izquierda
El operador <<
desplaza todos los bits hacia la izquierda. En el ejemplo, 3 << 2
es 00001100
, lo cual equivale a 12
.
int a = 3; // Binario: 00000011
int result = a << 2; // Desplaza dos bits a la izquierda
// Resultado: 12 (00001100)
}
Este desplazamiento es similar a multiplicar el número por potencias de 2 (en este caso, 3 * 2^2 = 12
).
Desplazamiento a la Derecha
El operador >>
desplaza los bits hacia la derecha. En el ejemplo, 12 >> 2
es 00000011
, que equivale a 3
.
int a = 12; // Binario: 00001100
int result = a >> 2; // Desplaza dos bits a la derecha
// Resultado: 3 (00000011)
Este desplazamiento es similar a dividir el número por potencias de 2 (12 / 2^2 = 3
).
Aplicaciones de los operadores de bit
Manipulación de Bits para Aplicar Máscaras
El uso de máscaras nos permite manipular bits específicos sin afectar a los demás. Por ejemplo, para establecer en 1
el tercer bit de un número:
int number = 5; // Binario: 00000101
int mask = 1 << 2; // Máscara: 00000100
number = number | mask; // Aplicamos OR bitwise para establecer el bit
// Resultado: 7 (00000111)
Verificación de Bits
Para comprobar si un bit específico está establecido (por ejemplo, el tercer bit):
int number = 5; // Binario: 00000101
int mask = 1 << 2; // Máscara: 00000100
bool isThirdHigh = number & mask // Verifica si el tercer bit está en 1
}
Uso de operadores de bits y bytes
Supongamos que queremos activar el tercer bit de una variable y desactivar el cuarto bit. Podríamos usar los operadores de bits de la siguiente manera:
int valor = 12; // Representación binaria: 1100
valor |= (1 << 2); // Activar tercer bit (contando desde 0)
valor &= ~(1 << 3); // Desactivar cuarto bit
}
En este ejemplo, estamos utilizando operadores de bits para realizar operaciones precisas en el tercer y cuarto bit de la variable valor
.