Saltar a contenido

El sistema binario

El sistema de numeración binario

Dado que los ordenadores almacenan la información en forma de ceros y unos, tendremos que habituarnos al sistema de numeración binario.

Para un principiante acostumbrado al sistema decimal, puede resultar bastante extraño tener que utilizar solo dos dígitos, pero no debemos olvidar que hay muchas formas de contar. A veces lo hacemos por docenas, y tenemos que calcular mentalmente que cinco docenas son sesenta unidades.

Recordemos, por ejemplo, los antiguos números romanos, una aritmética con grandes limitaciones, donde no existía el cero ni los números negativos. Tampoco había decimales, aunque en su lugar se utilizaban fracciones. En otras culturas como la china, la hebrea o la maya utilizaban sus propios sistemas de numeración, y parece ser que fueron los árabes quienes, a lo largo de sus conquistas, descubrieron la aritmética decimal, inventada en la India, y la expandieron allá por donde viajaron, siendo el origen del actual sistema de numeración utilizado en la cultura occidental.

¿A que se debe que contemos de diez en diez? Según los antropólogos, al hecho de que tengamos diez dedos en las manos. Es fácil observar que los niños los utilizan como una calculadora natural, y es de suponer que el hombre primitivo haría lo mismo. ¿Qué hubiera pasado si en lugar de tener cinco dedos en cada mano tuviésemos cuatro? Pues seguramente que contaríamos de ocho en ocho, y en lugar de un sistema decimal tendríamos uno octal.

En realidad podemos utilizar el sistema de numeración que queramos. Si deseáramos contar de cinco en cinco, tendríamos un sistema "quinario", si de tres en tres, uno "ternario". Y así sucesivamente. Los ordenadores sólo son capaces de utilizar ceros y unos, de ahí que los cálculos se hagan con aritmética binaria.

Examinando el sistema binario

Veamos una comparativa entre números decimales y su equivalente en binario:

tabla_binaria.py
1
2
for x in range(20):
    print(f"{x:2} = {x:6b}")

La ejecución muestra:

 0 =      0
 1 =      1
 2 =     10
 3 =     11
 4 =    100
 5 =    101
 6 =    110
 7 =    111
 8 =   1000
 9 =   1001
10 =   1010
11 =   1011
12 =   1100
13 =   1101
14 =   1110
15 =   1111
16 =  10000
17 =  10001
18 =  10010
19 =  10011

Véase que mostramos cada valor usando un f-string:

print(f"{x:2} = {x:6b}")

en ambos placeholders {} ponemos la variable x seguida de dos puntos y un especificador de formato:

  • {x:2} indica que insertamos el valor de x ocupando dos posiciones. Tratándose de un número, se alineará a la derecha y se rellenará con espacios en blanco por la izquierda.

  • {x:6b} vuelve a insertar la misma variable, con un ancho de 6 posiciones. La letra b es para que que el dato se muestre en binario.

¿Como interpretar los números binarios? En sistema decimal, cuando llegamos al nueve, se nos agotan los dígitos:

1, 2, 3, 4, 5, 6, 7, 8, 9 ...

y empezamos a combinarlos tomándolos de dos en dos, de tres en tres ...

10, 11 12 ... 98, 99, 100, 101 ...

En binario, los dígitos se agotan antes, y tenemos que combinarlos de la misma forma:

0, 1, 10, 11, 100, 101, 110, 111 ...

Conversiones

Dado un número binario, ¿cuál es su equivalencia en decimal? En la tabla anterior vemos que si tomamos como ejemplo el 10011, equivale a 19. Pero ¿cómo podemos hacer el cálculo para números más grandes sin tener que consultar esta tabla? Necesitamos una regla de conversión.

Analicemos un número decimal cualquiera, por ejemplo, el 723. Cada dígito toma un valor dependiendo de la posición en que se encuentra. El primer dígito, el siete, está en la posición de las centenas, por lo que vale 700 en lugar de 7. El segundo está en la posición de las decenas, por lo que vale 20 en lugar de 2. La suma de los dígitos aplicando su peso real es igual a 700+20+3=723:

Dígito:            7    2   3
Su peso:         100   10   1  
Multiplicando:   700   20   3    Suma: 723

La serie de pesos se obtiene multiplicando cada peso por diez:

1, 10, 100, 1.000, 10.000, 100.000, ...

En el sistema binario hacemos lo mismo, pero para obtener cada peso tenemos que multiplicar por dos en lugar de hacerlo por diez. Los pesos binarios son:

1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, ...

Utilizaremos estos pesos como hacíamos con el sistema decimal, aplicándolos de derecha a izquierda. Por ejemplo, dado el número binario 11010111:

Dígito:            1    1    0    1    0    1    1     1
Su peso:         128   64   32   16    8    4    2     1  
Multiplicando:   128   64    0   16    0    4    2     2     Suma: 215

Por lo tanto, el número binario 11010111 equivale al 215 en el sistema decimal. Véase que los dígitos de la derecha son los que se corresponden con los pesos de menos valor.

En realidad el cálculo es fácil: basta con memorizar estos pesos y sumar los correspondientes a los dígitos 1, despreciando los que están en la posición de los dígitos 0.

Para convertir a la inversa, hacemos lo siguiente. Tomemos el número 215. El mayor peso posible es 128. Si vamos restando los pesos obtenidos y tomamos el mayor posible para el resto, obtendremos que 215 = 128 +64 +16 + 4 +2 +1. Basta con poner un 1 en las posiciones correspondientes a estos pesos y dejar el resto a cero, obteniendo como resultado 11010111.

Hay un detalle adicional que no debemos perder de vista. En el sistema decimal, a los números tales como 10, 100, 1000, etc. les llamamos números “redondos”. En el sistema binario, los números redondos son los que acabamos de ver: 1, 2, 4, 8, 16, 32, 64, 128, 256 y 1024, es decir, las potencias de dos:

2 elevado a 0 = 1
2 elevado a 1 = 2
2 elevado a 2 = 4
2 elevado a 3 = 8
2 elevado a 4 = 16
2 elevado a 5 = 32
2 elevado a 6 = 64
2 elevado a 7 = 128
2 elevado a 8 = 256
2 elevado a 9 = 512
2 elevado a 10 = 1024

Estos números aparecen con frecuencia en el mundo de la informática. Por ejemplo, se suele decir que un byte son 8 bits, o que un mega es igual a un millón de bytes aproximadamente. En realidad son 1.048.576 bytes, resultado de multiplicar 1.024 x 1.024.

Literales binarios

Supongamos la siguiente sentencia en un programa Python:

x = 12345

Le estamos diciendo al ordenador que tenemos una variable llamado "x", que ocupa un espacio en la memoria RAM, y que queremos almacenar en ese lugar un valor 12345. Cuando escribimos un programa, escribir los literales en sistema decimal es lo que podríamos considerar como escritura natural, pero no nos da visión sobre los bits a almacenar en la memoria del ordenador. Podríamos escribir el literal en binario:

x = 0b11000000111001

Ya hemos visto que, en lenguaje Python, los literales binarios llevan un prefijo 0b.

Escribir los números en binario nos dan mayor control de lo que se almacena en memoria, pero también puede ser una fuente de errores, ya que con tantos ceros y unos es fácil equivocarse. Una posible solución es intercalar caracteres de subrayado:

x = 0b11_0000_0011_1001

En todo literal numérico, sea en formato decimal o binario, los caracteres de subrayado son decorativos y serán ignorados.

Otra alternativa es representar los literales numéricos usando otros sistemas de numeración, el octal o el hexadecimal. Lo veremos en los siguientes capítulos.