Introducción a C#
Por Nacho Cabanes, versión 0.93 de 16-abr-2010


(Nota: Estás viendo una versión del curso antigua, creada en 2009. Es recomendable que sigas la versión 2015, mucho más actualizada, con contenidos más detallados, más ejemplos y más ejercicios propuestos)

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