[Traducción de un artículo publicado en inglés el 24 de febrero de 2019]
El código binario es la base de los sistemas digitales y considero que es importante ser capaz de realizar la conversion a decimal de un número binario de hasta 16 bits de forma fluida. Esta habilidad te será de gran utilidad si trabajas con sistemas embebidos o en el diseño digital.
En un artículo anterior, se introdujeron las bases del sistema binario. Reutilizo uno de los párrafos::
” El binario es un sistema de representación numérica posicional en base 2. Un sistema posicional en base B representa números utilizando dígitos que pueden tomar valores entre el 0 y B-1 (del 0 al 1 en el caso del binario; del 0 al 9 en el caso del decimal, etc.), y que se escriben uno detrás de otro. La posición i que ocupa cada dígito determina su peso. Si asumimos que el dígito más a la derecha tiene la posición 0 y que el dígito más a la izquierda tiene la posición N-1 (porque hay N dígitos), el peso de cada dígito es B^i. Dado un número con N dígitos con valores b_i (b_i\in [0\ldots B-1] y i\in [0\ldots N-1]) su valor se puede calcular como:
valor = \sum_{i=0}^{N-1} b_i\cdot 2^i = b_{N-1}2^{N-1}+b_{N-2}2^{N-2}+\ldots +b_{1}2^{1}+b_{0}2^{0}.
Por ejemplo, el número binario 10011_2 tiene el valor en decimal 1\cdot2^4+0\cdot2^3+0\cdot2^2+1\cdot2^1+1\cdot2^0=16+2+1=19_{10}. “
Aprender de memoria el valor de unas cuantas potencias de dos puede resultar útil de varias formas. En primer lugar, nos vienen bien para convertir mentalmente cualquier número binario a decimal. Así que aplicaos y aprended las potencias de dos desde 2^0 hasta 2^{16}; es decir: 1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768 y 65536. Una vez que sepáis estas potencias de dos, es fácil determinar el mínimo número de bits que se requiere para representar en binary un número entero. Por ejemplo, si sabemos la mayor potencia de dos más cercana al número decimal x, podremos saber el número de bits que necesita su representación binaria. Digamos que queremos converir el número 240 a binario. La mayor potencia de dos más cercana es 256=2^8, lo que nos indica que el número requiere 8 bits. Ojo, que si el número es exactamente una potencia de 2, hay que sumar una unidad al exponente de la potencia para saber el número de bits. Y por supuesto, es esencial para poder hacer la conversión rápida de binario a decimal.
Así que vayamos con los “atajos”.
Unos consecutivos
Hablemos ahora de algo bastante trivial. Si sumamos 1 al número 999, se obtiene 1000.Por lo que 999=1000-1, es decir, 999=10^3-1, y vemos que el exponente de la potencia de la base es igual al número de nueves consecutivos. Podemos generalizar para números en base B compuestos de una secuencia de N dígitos consecutivos iguales a (B^N-1)_B, y particularizando para binario, con base (B=2), una secuencia de N unos consecutivos es igual a (2^N-1)_{10}. Así que ahora, asumiendo que dominamos las potencias de dos, podemos calcular fácilmente el valor decimal de números tales como:
-
- 1111111111_2=2^{10}-1=1024-1=1023
- Etc.
Ceros a la derecha
Añadir un cero a la derecha de un número es equivalente a multiplicarlo por su base. Por ejemplo, 560_{10}=56\times10, 110_2=11_2\times 2, etc. Por lo tanto, añadir N ceros a la derecha de un número binario es equivalente a multiplicarlo por 2^N . Esta propiedad puede ser útil en determinadas ocasiones:
10100_2=101_2\cdot 2^2=5\cdot4=20 (also, 16+4=20)
1111111111000_2=1111111111_2\cdot 2^3=(2^{10}-1)\cdot 8=1023\cdot8=8184
Etc.
Más unos que ceros
Si un número binario tiene tan solo unos cuantos ceros puede ser interesante ver el número como una serie de unos consecutivos a la que le faltan algunos unos. De esta manera, el número 111111110111_2 puede verse como 111111111111_2-1000_2=(2^{12}-1)-2^3=4095_{10}-8_{10}=4087_{10}. Veamos algunos ejemplos:
10111101_2=(2^8-1)-2^7-2^1=255-66=189
111111111100_2=(2^{12}-1)-3=4092 (ó 1023\cdot4=4092)
Vamos a juntarlo todo
Busquemos la mejor manera de realizar la conversion rápida de varios números. Asumo que se dominan las potencias de dos y que es fácil reconocer directamente números binarios pequeños.
10100000101=1024+256+5=1285
10100000101=5\cdot 2^8 + 5=5\cdot 257 = 1285
11110000=15\cdot16=240
11110111000=(255-8)\cdot8=247\cdot8=1976
11110111000=2047-64-7=2040-71=1976
1000000000001=4096+1=4097
1000000001110=4096+(7\cdot2)=4096+14=4110
111101000=8\cdot(63-2)=8\cdot61=488
Etc.
Ya está. No es física cuántica, pero con toda seguridad que es útil. En numerosas ocasiones estos trucos no serán efectivos, por lo que finalmente habrá que sumar las potencias de dos una a una para obtener el valor decimal. También se puede usar una calculadora en estos casos 🙂 .
En este artículo hemos tratado solamente números sin signo. El próximo tratará sobre la conversión rápida de números binarios con signo: números en complemento a dos. Aplicaos bien y pronto dominaréis el lenguaje binario de los vaporizadores de humedad (¡viva Star Wars!). ¡Nos vemos pronto!