Regístrate | Conectar
El Tamiz Libros Recursos Series Únete 11 Users Online
Skip to content

Computador mágico VIII – Representación binaria I: naturales




La serie “El computador mágico” está disponible también en forma de libro.

En la última entrada aprendimos a combinar puertas lógicas para hacer circuitos digitales complejos. Solo mostramos el ejemplo de uno sencillito, pero aprendimos que ese procedimiento podíamos utilizarlo para circuitos muy complejos.

Ahora tenemos que hacer un inciso en nuestro viaje de abajo a arriba para contar un poco sobre representación binaria.

Ya hemos visto las puertas lógicas, y hemos descubierto que con ellas se puede hacer operaciones sobre variables que sean binarias (allí las llamábamos entradas a un circuito, ahora estoy diciendo variables de una función… elige el nombre que más te guste). Es decir, nuestras variables siempre valen 0 ó 1. Incluso habremos oído mil veces que el ordenador solo maneja ceros y unos.

Pero en nuestra vida real queremos hacer operaciones sobre cosas un poco más complejas. Por ejemplo, a lo mejor estamos haciendo un balance contable, y lo que queremos es sumar euros. O a lo mejor estamos escribiendo un libro, y entonces queremos manejar letras. O a lo mejor estamos jugando a un videojuego de billar y lo que queremos es calcular la velocidad y posición de las bolas en cada momento con muchísima precisión.

El caso es que las puertas lógicas solamente saben manejar ceros y unos, de modo que tenemos que buscar la forma de representar esos números y letras de alguna forma.

 

En este artículo vamos a centrarnos en los números naturales, para dedicar los siguientes a los números enteros, los de coma flotante y al texto. En futuros artículos, mucho más avanzados, pensaremos someramente en representar otros tipos de datos.

Existen muchas formas de representar números enteros en binario, pero nosotros vamos a contar solo una (la más usada, y no por casualidad).

Para comprenderla, lo mejor es empezar por entender cómo funciona la representación decimal. Sí, sí, la que usas toda tu vida. Una vez que realmente entiendas cómo funciona la representación decimal, la mitad del camino hacia la representación binaria está hecho.

Vamos a empezar con un número cualquiera… por ejemplo el cientosiete. Fíjate en que lo he escrito en letras, y es intencionado. Y además sé que no está ortográficamente bien escrito, pero es que quiero que te centres en el concepto del número. Piensa de momento en el cientosiete como un concepto abstracto.

¿Ya?

Ahora escribe su representación numérica.

107

¿Por qué has puesto un 1, un 0 y un 7?

Lo has hecho porque estás usando una representación decimal, en la que multiplicas cada cifra por la potencia de 10 correspondiente a esa posición. Así, los símbolos 1, 0 y 7, puestos en ese orden, significan:

1\cdot{}10^2+0\cdot{}10^1+7\cdot{}10^0=

=1\cdot{}100+0\cdot{}10+7\cdot{}1=

100+0+7=

=cientosiete

Vale, pues la representación binaria es igual, pero usando como base el 2 en lugar del 10.

Así, podríamos decir que el cientosiete representado en binario es:

1101011

Podemos comprobarlo:

1\cdot{}2^6+1\cdot{}2^5+0\cdot{}2^4+1\cdot{}2^3+0\cdot{}2^2+1\cdot{}2^1+1\cdot{}2^0=

=1\cdot{}64+1\cdot{}32+0\cdot{}16+1\cdot{}8+0\cdot{}4+1\cdot{}2+1\cdot{}1=

=64+32+0+8+0+2+1=

=cientosiete

Creo que hasta aquí es algo que se enseña en el colegio, en primaria, así que no es novedoso para nadie.

Es muy habitual que elijamos un tamaño de número y rellenemos con 0s a la izquierda si es que nos hace falta. En el futuro veremos que es muy habitual que los números enteros sean de 7/8 bits, de 15/16 bits o de 31/32 bits. El hecho de que sean 8, 16 y 32 es una elección arbitraria. Bien podrían haber sido 10, 20 y 30; ó 10 y 100; ó ya puestos 4, 8, 15, 16, 23 y 42 bits, ¿qué más da? De hecho, ha habido a lo largo de la historia ordenadores que usaban números de 10 bits y cosas así. No obstante, el que sean 8, 16 y 32 tiene sus ventajas: ni demasiado grandes ni demasiado pequeños; unos son múltiplos de otros; todos ellos son, además, potencias de dos… en fin, que inicialmente la decisión era arbitraria, pero que hayan acabado venciendo estos tamaños no es casualidad.

Pero de momento vamos a autolimitarnos a los números de 7 bits. Veamos algunos ejemplos de números y su representación con 7 bits:[1]

Cuarentaydos se representa 0101010.

Treintaydos se representa 0100000.

Veintisiete se representa 0011011.

Veinticinco se representa 0011001.

Cincuentaydos se representa 0110100.

Trece se representa 0001101.

Cinco se representa 0000101.

Sesentaicinco se representa 1000001.

Cientoveintisiete se representa 1111111.

Fíjate en que hemos rellenado con ceros a la izquierda cuando lo necesitábamos para completar los 7 bits.

¿Cómo operamos con estos números? Pues muy sencillo: igual que con los decimales… pero sabiendo que la base es 2.

Por ejemplo, vamos a sumar veintisiete y veinticinco. ¿Cómo lo haríamos en base decimal?

\begin{aligned}~27\\+25\\\hline\\~52\end{aligned}

Y lo leemos de la siguiente manera: siete y cinco, dos y me llevo una; dos y dos son cuatro, y una que llevaba, 5.[2]

Vale, pues ahora vamos a sumarlo en binario, pero esta vez vamos a hacerlo paso a paso, para que veas que es igual:

\begin{aligned}~0011011\\+0011001\\\hline\\~~~~~~~0\\y~me~llevo~1\end{aligned}

Es decir: 1 más 1, 0 y me llevo 1. Ten en cuenta que en base-10 cuando llegábamos al 10 lo que hacíamos era tomar todo lo que sobraba desde 10 y “llevarnos 1″. Pues aquí lo mismo, solo que como es base-2, tomamos lo que sobra a partir de 2 (inclusive). Por eso, 1 más 1 no es 2, sino que 1 más 1 es 0, y me llevo 1.

\begin{aligned}~0011011\\+0011001\\\hline\\~~~~~~00\\y~me~llevo~1\end{aligned}

Es decir: 1 más 0 es 1, más 1 que me llevaba, 0 y me llevo 1. Pongamos un paso más:

\begin{aligned}~0011011\\+0011001\\\hline\\~~~~~100\\\end{aligned}

Se lee: 0 más 0 es 0, más 1 que me llevaba, 1 [y no me llevo nada]. Supongo que no hace falta que siga, así que voy al resultado final:

\begin{aligned}~0011011\\+0011001\\\hline\\~0110100\\\end{aligned}

Lo cual no es ni más ni menos que la representación binaria del cincuentaydos, obviamente.

¿Cómo hacemos la multiplicación? Pues básicamente igual. Por ejemplo, multipliquemos trece por cinco:

\begin{aligned}~13\\\times~5\\\hline\\~65\end{aligned}

Y se lee: cinco por tres, quince, y me llevo una; cinco por una, cinco, y una que me llevaba, seis.

Pues en binario es casi tan fácil como eso, pero con dos salvedades. Primero, tenemos que recordar cómo se multiplicaba por varias cifras: moviendo hacia la izquierda un espacio por cada cifra a la izquierda de la primera que estuviéramos multiplicando; y al acabar sumábamos todo. Y sabiéndonos las tabla del 0 y la tabla del 1. No os quejaréis, son las dos más fáciles: cualquier cosa por 0, es 0; cualquier cosa por 1, es esa misma cosa. Esta vez no lo voy a hacer cifra a cifra; pongo pasos grandes y espero que vayas estendiéndolos con un poco de esfuerzo por tu parte:

\begin{aligned}~0001101\\\times~0000101\\\hline\\~0001101\\~0000000\;\:\\~0001101\;\:\;\:\\~0000000\;\:\;\:\;\:\\~0000000\;\:\;\:\;\:\;\:\\~0000000\;\:\;\:\;\:\;\:\;\:\\~0000000\;\:\;\:\;\:\;\:\;\:\;\:\\\hline\\0000001000001\\\hline1000001\end{aligned}

Fíjate cómo en la última línea, además de sumar todos los términos que nos encontramos por encima, recortamos a 7 bits. Obviamente, podría ocurrir que el número resultado necesitara más de 7 bits. Si por ejemplo, multiplicamos 0101010 [42] por 0100000 [32], obtendremos 10101000000 [1344], que tiene más de 7 bits, y por tanto no lo podemos representar con 7 bits. Se dice entonces que la operación ha desbordado (aunque se suele usar más el término inglés overflow), y el resultado que podemos almacenar con 7 bits es básicamente basura. Esto es un problema conocido por los programadores, que tienen que evitarlo en sus diseños. El que lo consigan o no… es harina de otro costal.

Fíjate en que con nuestros 7 bits, el número más pequeño que podemos representar es el 0000000 (en decimal: 0), y el más alto es el 1111111 (en decimal, 127). Si necesitáramos representar números más altos, podríamos usar 15 bits. En ese caso, podríamos llegar hasta el 111 1111 1111 1111 (32 767).[3] ¿Y si queremos más? Pues números de 31 bits, hasta llegar al 2 147 483 647. En fin, no hace falta que siga: 63 bits, 127 bits…

Pero… ¿y si lo que queremos es bajar de 0? ¿Y si lo que queremos es representar un número negativo? Eso es lo que veremos dentro de un par de capítulos. Antes queremos ver, en el siguiente capítulo, cómo implementar todo esto con puertas lógicas.

Ah, se nos queda un ejercicio: intenta encontrar tú mismo la forma de hacer una división en representación binaria. Sabiendo como sabes hacer la multiplicación binaria y la división decimal entera (esto es: que no da por resultado decimales, sino dividendo-divisor-cociente-resto), no debería resultarte difícil.

 

 

  1. Más adelante, en el próximo capítulo, entenderás por qué usamos 7 y no 8, y por qué decimos 7/8. []
  2. Estoy absolutamente seguro de que en España se decía y se sigue diciendo lo de “me llevo 1″. Espero que en Sudamérica también se diga. []
  3. Fíjate en que, de modo parecido a los números en base decimal, solemos introducir un espacio cada 4 cifras, porque, si no, es fácil perderse. []

Sobre el autor:

J ( )

 

{ 1 } Comentarios

  1. Gravatar Brigo | 16/10/2012 at 12:39 | Permalink

    Por fin algo que me se. Esto de aprender y la humildad está muy bien, pero estaba quedando sin autoestima! :-)

    Muy bien explicado

Escribe un comentario

Tu dirección de correo no es mostrada. Los campos requeridos están marcados *

Al escribir un comentario aquí nos otorgas el permiso irrevocable de reproducir tus palabras y tu nombre/sitio web como atribución.