Podemos hacer desde C operaciones entre bits de dos números (AND, OR, XOR, etc). Vamos primero a ver qué significa cada una de esas operaciones.
Operación |
Qué hace |
En C |
Ejemplo |
Complemento (not) |
Cambiar 0 por 1 y viceversa |
~ |
~1100 = 0011 |
Producto lógico (and) |
1 sólo si los 2 bits son 1 |
& |
1101 & 1011 = 1001 |
Suma lógica (or) |
1 si uno de los bits es 1 |
| |
1101 | 1011 = 1111 |
Suma exclusiva (xor) |
1 sólo si los 2 bits son distintos |
^ |
1101 ^ 1011 = 0110 |
Desplazamiento a la izquierda |
Desplaza y rellena con ceros |
<< |
1101 << 2 = 110100 |
Desplazamiento a la derecha |
Desplaza y rellena con ceros |
>> |
1101 >> 2 = 0011 |
Ahora vamos a aplicarlo a un ejemplo completo en C:
/*---------------------------*/
/* Ejemplo en C nº 93: */
/* C093.C */
/* */
/* Operaciones de bits en */
/* números enteros */
/* */
/* Curso de C, */
/* Nacho Cabanes */
/*---------------------------*/
#include
int main() {
int a = 67;
int b = 33;
printf("La variable a vale %d\n", a);
printf("y b vale %d\n", b);
printf(" El complemento de a es: %d\n", ~a);
printf(" El producto lógico de a y b es: %d\n", a&b);
printf(" Su suma lógica es: %d\n", a|b);
printf(" Su suma lógica exclusiva es: %d\n", a^b);
printf(" Desplacemos a a la izquierda: %d\n", a << 1);
printf(" Desplacemos a a la derecha: %d\n", a >> 1);
return 0;
}
La respuesta que nos da Dev-C++ 4.9.9.2 es la siguiente:
La variable a vale 67
y b vale 33
El complemento de a es: -68
El producto lógico de a y b es: 1
Su suma lógica es: 99
Su suma lógica exclusiva es: 98
Desplacemos a a la izquierda: 134
Desplacemos a a la derecha: 33
Para comprobar que es correcto, podemos convertir al sistema binario esos dos números y seguir las operaciones paso a paso:
67 = 0100 0011
33 = 0010 0001
En primer lugar complementamos "a", cambiando los ceros por unos:
1011 1100 = -68
Después hacemos el producto lógico de A y B, multiplicando cada bit, de modo que 1*1 = 1, 1*0 = 0, 0*0 = 0
0000 0001 = 1
Después hacemos su suma lógica, sumando cada bit, de modo que 1+1 = 1, 1+0 = 1, 0+0 = 0
0110 0011 = 99
La suma lógica exclusiva devuelve un 1 cuando los dos bits son distintos: 1^1 = 0, 1^0 = 1, 0^0 = 0
0110 0010 = 98
Desplazar los bits una posición a la izquierda es como multiplicar por dos:
1000 0110 = 134
Desplazar los bits una posición a la derecha es como dividir entre dos:
0010 0001 = 33
¿Qué utilidades puede tener todo esto? Posiblemente, más de las que parece a primera vista. Por ejemplo: desplazar a la izquierda es una forma muy rápida de multiplicar por potencias de dos; desplazar a la derecha es dividir por potencias de dos; la suma lógica exclusiva (xor) es un método rápido y sencillo de cifrar mensajes; el producto lógico nos permite obligar a que ciertos bits sean 0 (algo que se puede usar para comprobar máscaras de red); la suma lógica, por el contrario, puede servir para obligar a que ciertos bits sean 1...
Un último comentario: igual que hacíamos operaciones abreviadas como
x += 2;
también podremos hacer cosas como
x <<= 2;
x &= 2;
x |= 2;
...