[Conversión de binario a decimal – parte I]
(Traducción del inglés de la entrada Fast binary conversion – Part II publicada el 30/3/2019)
En esta entrada continuaremos hablando de la conversión rápida de números binarios, esta vez centrándonos en números con signo, y en particular, en números en complemento a dos (C2). Los números binarios se introdujeron en un post anterior (Sinistar), donde además se trató brevemente de los números en C2:
“En la representación en C2, el bit más significativo (más a la izquierda) se utiliza como bit de signo. Los números positivos tendrían este bit a 0 y los negativos a 1. El número se obtiene de la siguiente forma: valor = -b_{N-1}\cdot 2^{N-1} + {\sum_{i=0}^{N-2} 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}.
Con esto, el número 3 se representaría con 8 bits como 00000011 y el -3 como 11111101. Si hacéis las cuentas sale. Lo interesante de los números en C2 es que podemos sumarlos sin importar que sean positivos o negativos y el resultado nos dará positivo o negativo directamente, y será correcto (siempre que se pueda representar con el número de bits disponibles). Como digo, no puedo contarlo todo, pero si sumamos los números 3 y -3 en C2 se ve que el resultado es 0 (00000011+11111101 = 100000000, descartando el noveno bit). Por lo tanto, restar una unidad a un número es lo mismo que sumarle -1, que en binario con C2 es el número 11111111… “
Pues nada, veamos si podemos encontrar maneras de leer numeros binarios en C2 de forma rápida.
Números positivos
Los números positivos son aquellos que poseen un cero en el bit más significativo (MSB, del inglés: most significant bit). Así que el peso negativo, que es el del bit más significativo, queda multiplicado por cero por lo que el valor del número es positivo. Por ejemplo, el número en C2 011 es 3, porque 011_2=(-2^2)\times 0 + 2^1\times 1 + 2^0\times 1 = 3_{10}. Por lo tanto, si el MSB es cero, los números son positivos y podemos aplicar todas las reglas que vimos en la parte I.
A partir de este punto nos centramos en números negativos.
Todos unos
Un número de N bits con N unos es siempre igual a -1_{10}. El motivo es bastante claro:
111 \cdots 111_{2}=1000 \cdots 000_2+011 \cdots 111_2=(-2^{N-1})+(2^{N-1}-1)=-1_{10}Aquí hemos aplicado la regla de los “unos consecutivos” para el segundo término de la suma. Con esto:
1_2=-1_{10}11_2=-1_{10}
111_2=-1_{10}
…
1111111111_2=-1_{10}Etc.
Más unos que ceros
Un número con más unos que ceros puede verse como un número formado por unos en su totalidad con algunos unos que han sido restados. Por ejemplo:
111101_2=111111_2-000010_2=-1_{10}-2_{10}=-3_{10} 1111010111_2=1111111111_2-0000101000_2 = -1_{10}-40_{10} = -41_{10}Es sencillo inferir del ejemplo que una forma de leer los números negativos en C2 es invertir los ceros y unos, añadir una unidad y luego aplicar el signo negativo. De esta manera, un número negativo B puede convertirse a decimal aplicando la operación -(\bar{B}+1)=-\bar{B}-1. Por ejemplo, 111101_2=-000010_2-1 = -2-1=-3. Así que ahora puedes elegir entre “ver” los números negativos como el número -1 al que le faltan “unos” justo donde están los ceros, o como el resultado de multiplicar -1 por el número binario invertido, menos uno.
Más ceros que unos para números negativos
Si hay más ceros que unos puede ser una buena opción simplemente sumar los pesos de los dígitos que valen unos:
10000001_2= -2^7+1=-1271000101_2= -2^6+4+1=-59
1000000000_2= -2^9=-512
Ceros a la derecha
Al igual que ocurría con números sin signo (y números positivos en 2C), el efecto de tener ceros a la derecha es equivalente a multiplicar por una potencia de dos. PAra números negaticos tenemos:
10100_2=101_2\cdot 2^2=-3\cdot4=-12
1111111111000_2=1111111111_2\cdot 2^3=-1\cdot 8=-8_{10}
11110101110000_2=1111010111_2\cdot 2^4 = -41_{10}\cdot 16 = -656_{10}
100010100_2=1000101_2\cdot2^2= (-2^6+4+1)\cdot 4=-61\cdot 4 = 244_{10}Etc.
Juntémoslo todo
Ahora lo juntamos todo con el objetivo de intentar encontrar la forma más eficiente de realizar la conversión rápida de varios números en C2.
010100000101=1024+256+5=1285
10100000101=-6\cdot128+5=-768+5=-763
011110000=15\cdot16=240
11110000=-1\cdot16=-16
011110111000=(255-8)\cdot8=247\cdot8=1976
11110111000=-9\cdot8=-72
Etc.
Con esta entrada y con la anterior (parte I) creo que hemos aprendido algunos trucos que pueden ser útiles si no disponemos de una calculadora a mano. Queda abierto el tema de si con lo que hemos aprendido podremos comunicarnos con soltura con los vaporizadores de humedad. Me vais contando.
2 comentarios
Estan ma los nuemros en
Más ceros que unos para números negativos
Repasalo que no lo has calculado bien
Author
Tienes toda la razón Eugenio, había puesto -128+1=-126 y -64+4+1=-61. Ya está corregido. Te lo agradezco mucho.
Un saludo