Operadores a nivel de bits en C

Author
Por Darío Rivera
Publicado el en Lenguaje 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

Acerca de Darío Rivera

Author

Application Architect at Elentra Corp . Quality developer and passionate learner with 10+ years of experience in web technologies. Creator of EasyHttp , an standard way to consume HTTP Clients.

LinkedIn Twitter Instagram

Sólo aquellos que han alcanzado el éxito saben que siempre estuvo a un paso del momento en que pensaron renunciar.