Operadores a nivel de bits en C
Los operadores a nivel de bits permiten realizar desplazamientos y realizar ciertas operaciones bit a bit. Estas operaciones solo pueden ser realizadas en números enteros y que estos son tratados más como conjuntos de bits que como números decimales.
Puede parecer un poco confuso al comienzo la realización de operaciones a nivel de bits ya que mover un bit de un número como 65 puede resultar en el doble o la mitad de dicho número. Sin embargo, basta observar el movimiento de los bits y entender su representación binaria y decimal.
Para los siguiente ejemplos, supongamos que el tipo short
tiene un tamaño de 16 bits. Con este supuesto, vamos a representar algunos números y realizar operaciones sobre ellos. Te recomiendo leer antes nuestro artículo Tipos de Datos en C ya que este explica cómo son creados los tipos de datos y por qué tiene una cantidad de bits especificada.
Operador <<
El operador de desplazamiento hacia la izquierda ( <<
) mueve cada bit hacia la izquierda y coloca un cero como bit menos significativo (más hacia la derecha) y el bit más significativo (más hacia la izquierda) se descarta. Observa el siguiente ejemplo en donde se utiliza este operador para correr un bit a un número y su resultado resulta ser el doble (decimal).
Operación
<< 0000000001000001 (65)
0000000010000010 (130)
Código
short a = 65;
printf("Dec: %d\n\n", a);
a = a << 1;
printf("Dec: %d\n", a);
Salida
Dec: 65
Dec: 130
Operador >>
El operador de desplazamiento hacia la derecha ( >>
) mueve cada bit hacia la derecha descartando los bits menos significativos. Por supuesto, los bits más significativos se completan con ceros. Observa el siguiente ejemplo en donde se utiliza este operador para correr un bit a un número y su resultado resulta ser la mitad (decimal).
Operación
<< 0000000000001010 (10)
0000000000000101 (5)
Código
short a = 10;
printf("Dec: %d\n\n", a);
a = a >> 1;
printf("Dec: %d\n", a);
Salida
Dec: 10
Dec: 5
Operador & (AND)
El operador AND ( &
) compara dos bits. Si ambos resultan ser 1 entonces el resultado será 1, de lo contrario el resultado será cero. Observa el siguiente ejemplo en donde realizamos esta comparación bit a bit de dos números.
Operación
& 0000000010101010 (170)
0000000011000000 (192)
Resultado:
0000000010000000 (128)
Código
short a = 170;
short b = 192;
short c = a & b;
printf("Operation: %d & %d\n", a, b);
printf("Result: %d\n", c);
Salida
Operation: 170 & 192
Result: 128
Operador | (OR)
El operador AND ( |
) compara dos bits. Si al menos uno de los dos resulta ser 1 entonces el resultado será 1, de lo contrario el resultado será cero. Observa el siguiente ejemplo en donde realizamos esta comparación bit a bit de dos números.
Operación
& 0000000010101010 (170)
0000000011000000 (192)
Resultado:
0000000011101010 (234)
Código
short a = 170;
short b = 192;
short c = a & b;
printf("Operation: %d | %d\n", a, b);
printf("Result: %d\n", c);
Salida
Operation: 170 & 192
Result: 134
Operador ^ (XOR)
El operador AND ( ^
) compara dos bits. Si los dos bits son complementarios entonces el resultado será 1, de lo contrario el resultado será cero. Observa el siguiente ejemplo en donde realizamos esta comparación bit a bit de dos números.
Operación
& 0000000010101010 (170)
0000000011000000 (192)
Resultado:
0000000001101010 (106)
Código
short a = 170;
short b = 192;
short c = a ^ b;
printf("Operation: %d ^ %d\n", a, b);
printf("Result: %d\n", c);
Salida
Operation: 170 & 192
Result: 106