Este sitio web usa cookies de terceros para analizar el tráfico y personalizar los anuncios. Si no está de acuerdo, abandone el sitio y no siga navegando por él. ×


11. Otras características avanzadas de C

11.1 Operaciones con bits

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;
...