3.8. Conversión de números decimales a números binarios

En su estudio de las ciencias de la computación, usted probablemente ha estado expuesto de una manera u otra a la idea de un número binario. La representación binaria es importante en ciencias de la computación puesto que todos los valores almacenados en la computadora son cadenas de dígitos binarios, es decir, cadenas de unos y ceros. Sin la capacidad de convertir entre representaciones comunes y números binarios, necesitaríamos interactuar con las computadoras de maneras muy incómodas.

Los valores enteros son ítems de datos comunes. Se utilizan todo el tiempo en programas informáticos y en la computación. Aprendemos sobre ellos en la clase de matemáticas y por supuesto los representamos usando el sistema numérico decimal, o la base 10. El número decimal \(233_{10}\) y su equivalente binario correspondiente \(11101001_{2}\) son interpretados respectivamente como

\(2\times10^{2} + 3\times10^{1} + 3\times10^{0}\)

y

\(1\times2^{7} + 1\times2^{6} + 1\times2^{5} + 0\times2^{4} + 1\times2^{3} + 0\times2^{2} + 0\times2^{1} + 1\times2^{0}\)

Pero, ¿cómo podemos convertir fácilmente valores enteros en números binarios? La respuesta es un algoritmo llamado “Dividir by 2” que utiliza una pila para realizar un seguimiento de los dígitos del resultado binario.

El algoritmo de dividir por 2 supone que comenzamos con un entero mayor que 0. Una simple iteración divide continuamente el número decimal por 2 y mantiene un seguimiento del residuo. La primera división por 2 indica si el valor es par o impar. Un valor par tendrá un residuo 0. Él tendrá el dígito 0 en la posición de las unidades. Un valor impar tendrá un residuo 1 y tendrá el dígito 1 en la posición de las unidades. Pensamos construir nuestro número binario como una secuencia de dígitos; el primer residuo que calcularemos será el último dígito de la secuencia. Como se muestra en la Figura 5, volvemos a ver la propiedad de inversión que indica que una pila es probablemente la estructura de datos adecuada para resolver el problema.

../_images/dectobin.png

Figura 5: Conversión de decimal a binario

Figura 5: Conversión de decimal a binario

El código de Python en el ActiveCode 1 implementa el algoritmo Dividir por 2. La función dividirPor2 toma un argumento que es un número decimal y lo divide repetidamente entre 2. La línea 7 utiliza el operador módulo incorporado, %, para extraer el residuo y la línea 8 lo incluye luego en la pila. Después de que el proceso de división llegue a 0, se construirá una cadena binaria en las líneas 11-13. La línea 11 crea una cadena vacía. Los dígitos binarios se extraen de la pila uno a la vez y se añaden al extremo derecho de la cadena. Finalmente, se devuelve la cadena binaria.

El algoritmo para la conversión binaria se puede ampliar fácilmente para realizar la conversión a cualquier base. En ciencias de la computación es común utilizar una serie de codificaciones diferentes. Las más comunes son la binaria, la octal (base 8) y la hexadecimal (base 16).

El número decimal \(233\) y sus correspondencias equivalentes en octal y hexadecimal \(351_ {8}\) y \(E9_ {16}\) se interpretan como

\(3\times8^{2} + 5\times8^{1} + 1\times8^{0}\)

y

\(14\times16^{1} + 9\times16^{0}\)

La función dividirPor2 puede modificarse para aceptar no sólo un valor decimal sino también una base para la conversión deseada. Una nueva función llamada convertirBase, que se muestra en el ActiveCode 2, toma como parámetros un número decimal y cualquier base entre 2 y 16. Los residuos se envían a la pila hasta que el valor que esté siendo convertido se vuelva 0. Se puede usar la misma técnica de construcción de cadena de izquierda a derecha con un ligero cambio. Los números de base 2 a base 10 necesitan un máximo de 10 dígitos, así que los caracteres típicos para los dígitos 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9 funcionan bien. El problema surge cuando vamos más allá de la base 10. Ya no podemos simplemente usar los residuos, ya que ellos mismos están representados como números decimales de dos dígitos. En su lugar, necesitamos crear un conjunto de dígitos que se puedan utilizar para representar los residuos superiores a 9.

Una solución a este problema es extender el conjunto de dígitos para incluir algunos caracteres del alfabeto. Por ejemplo, en hexadecimal se usan los diez dígitos decimales junto con los seis primeros caracteres del alfabeto para los 16 dígitos. Para implementar esto, se crea una cadena de dígitos (línea 4 en el ActiveCode 2) que almacena los dígitos en sus posiciones correspondientes. 0 está en la posición 0, 1 está en la posición 1, A está en la posición 10, B está en la posición 11, y así sucesivamente. Cuando se elimina un residuo de la pila, éste se puede utilizar para indizar en la cadena de dígitos y el dígito resultante correcto puede añadirse a la respuesta. Por ejemplo, si el residuo 13 se elimina de la pila, el dígito D se añade a la cadena resultante.

Autoevaluación

¿Cuál es el valor de 25 expresado como un número octal? Incorrecto

¿Cuál es el valor de 256 expresado como un número hexadecimal?

¿Cuál es el valor de 26 expresado en base 26? Tal vez usted deba modificar la función convertirBase, or simplemente encontrar un patrón en la conversión de bases.

Next Section - 3.9. Expresiones en notaciones infija, prefija y sufija