9.2. 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 |
Resultado |
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 sólo si uno de los bits es 1 |
| |
1101 | 1011 = 1001 |
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# */ /* bits.cs */ /* */ /* Operaciones entre bits */ /* */ /* Introduccion a C#, */ /* Nacho Cabanes */ /*---------------------------*/ using System; public class bits { public static void Main() { int a = 67; int b = 33; Console.WriteLine("La variable a vale {0}", a); Console.WriteLine("y b vale {0}", b); Console.WriteLine(" El complemento de a es: {0}", ~a); Console.WriteLine(" El producto lógico de a y b es: {0}", a&b); Console.WriteLine(" Su suma lógica es: {0}", a|b); Console.WriteLine(" Su suma lógica exclusiva es: {0}", a^b); Console.WriteLine(" Desplacemos a a la izquierda: {0}", a << 1); Console.WriteLine(" Desplacemos a a la derecha: {0}", a >> 1); } }
El resultado es:
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; ...