Sistemas de numeración y aritmética binaria Héctor Antonio Villa Martínez Programa de Ciencias de la Computación Universidad de Sonora Este reporte consta de tres secciones. Primero, la Sección 1 presenta los sistemas de numeración más utilizados en el diseño de sistemas digitales. En seguida, la Sección 2 muestra los principales métodos para convertir números de un sistema de numeración a otro. Por último, la Sección 3 explica como se realizan las cuatro operaciones aritméticas básicas (suma, resta, multiplicación y división) en binario. 1. Sistemas de numeración El sistema de numeración de uso común, conocido como sistema decimal o base 10, utiliza diez dígitos (0, 1, ..., 9) para representar números. El sistema decimal es posicional porque el valor de un número se obtiene multiplicando cada dígito por la potencia de 10 que le corresponde a la posición del dígito dentro del número. La potencia se encuentra asignando la posición cero al dígito que está a la izquierda del punto decimal y luego numerando el resto de los dígitos, ascendentemente hacia la izquierda y descendentemente hacia la derecha. Asi el valor del número decimal 727.53 es: 727.53 = 7 × 102 + 2 × 101 + 7 × 100 + 5 × 10−1 + 3 × 10−2 = 700 + 20 + 7 + 0.5 + 0.03 = 727.53 De la misma forma se pueden representar números en otros sistemas de numeración. En el diseño de sistemas digitales los sistemas de numeración 1 más utilizados, además del sistema decimal, son el sistema binario o base 2, el sistema octal o base 8 y el sistema hexadecimal o base 16. Cada uno de estos sistemas se presentará a continuación. El sistema binario emplea solo dos dígitos, 0 y 1, para representar números. Como la base del sistema es 2, cada dígito binario se multiplica por la potencia de 2 que le corresponde: 11001.0112 = 1 × 24 + 1 × 23 + 0 × 22 + 0 × 21 + 1 × 20 + 0 × 2−1 + 1 × 2−2 + 1 × 2−3 = 16 + 8 + 1 + 0.25 + 0.125 = 25.37510 Nótese como para evitar confusiones entre números en bases distintas se acostumbra marcar la base como un subíndice del número. El sistema octal, por otro lado, utiliza ocho dígitos, 0, 1, ..., 7, para representar números y cada dígito octal se multiplica por la potencia de 8 que le toca: 142.48 = 1 × 82 + 4 × 81 + 2 × 80 + 4 × 8−1 = 64 + 32 + 2 + 0.5 = 98.510 Por último, como el sistema hexadecimal necesita de dieciséis dígitos, se utilizan los diez dígitos decimales para representar dígitos entre 0 y 9 y las primeras seis letras del alfabeto para los dígitos del 10 al 15. De esta forma, A representa 1010 , B representa 1110 , C representa 1210 , D representa 1310 , E representa 1410 y F representa 1510 . Parecido a los casos anteriores, cada dígito hexadecimal se multiplica por la potencia correspondiente de la base, en este caso 16: D6C.5AF16 = 13 × 162 + 6 × 161 + 12 × 160 + 5 × 16−1 + 10 × 16−2 + 15 × 16−3 = 3328 + 96 + 12 + 0.3125 + 0.0390625 + 0.00366210938 = 3436.3552246093810 Como un ejemplo adicional, el Cuadro 1 lista los primeros 32 números enteros en base 10, 2, 8 y 16. 2 Cuadro 1: Los primeros 32 números enteros en base 10, 2, 8 y 16. base 10 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 base 2 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 base 8 0 1 2 3 4 5 6 7 10 11 12 13 14 15 16 17 base 16 0 1 2 3 4 5 6 7 8 9 A B C D E F 3 base 10 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 base 2 10000 10001 10010 10011 10100 10101 10110 10111 11000 11001 11010 11011 11100 11101 11110 11111 base 8 20 21 22 23 24 25 26 27 30 31 32 33 34 35 36 37 base 16 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 2. Conversión entre sistemas de numeración Esta sección presenta los principales métodos para convertir números de una base a otra. Como el sistema decimal es el sistema de numeración de uso común, primero se presentan los métodos para convertir de base 10 a otra base (Subsección 2.1) y de otra base a base 10 (Subsección 2.2). Después se explica la conversión entre dos bases arbitrarias (Subsección 2.3). Por último, se muestra una forma rápida para convertir entre base 2 y bases 8 y 16 (Subsección 2.4). 2.1. De base 10 a otra base La conversión de un número en base 10 a otra base, r, se realiza mediante dos procedimientos separados, uno para obtener la parte entera del número en base r y otro para obtener la parte fraccionaria. La parte entera del número en base r se obtiene dividiendo la parte entera del número decimal sucesivamente entre r, guardando en cada paso el residuo, y volviendo a dividir el cociente entre r. Esta división continúa hasta que el cociente sea cero. En este momento, la parte entera del número en base r se forma considerando los residuos en el orden inverso en que se obtuvieron. Es decir, el dígito más significativo de la parte entera es el último residuo que se generó y el dígito menos significativo es el primer residuo. La parte fraccionaria del número en base r se obtiene multiplicando la parte fraccionaria del número decimal sucesivamente por r, guardando en cada paso la parte entera del resultado, y volviendo a multiplicar la parte fraccionaria del resultado por r. Esta multiplicación continúa hasta que la parte fraccionaria del resultado sea cero o se obtenga la precisión deseada. En este momento, la parte fraccionaria del número en base r se forma considerando los enteros en el mismo orden en que se obtuvieron. Como ejemplo considere convertir 26.375 de base 10 a base 2. La parte entera se convierte así: 26 ÷ 2 → cociente = 13, residuo = 0 (dígito menos significativo) 13 ÷ 2 → cociente = 6, residuo = 1 6 ÷ 2 → cociente = 3, residuo = 0 3 ÷ 2 → cociente = 1, residuo = 1 1 ÷ 2 → cociente = 0, residuo = 1 (dígito mas significativo) Y la parte fraccionaria así: 0.375 × 2 = 0.75 → entero = 0 fracción 0.75 (primer dígito fraccionario) 4 0.75 × 2 = 1.5 → entero = 1 fracción 0.5 0.5 × 2 = 1.0 → entero = 1 fracción 0.0 (último dígito fraccionario) En conclusión, 26.37510 = 11010.0112 . En ocasiones nos encontramos con fracciones decimales que no se pueden representar en otras bases de manera exacta. Para estos casos es necesario definir una precisión o detener el proceso si la fracción en base r es cíclica. Un ejemplo de esta última situación se genera al convertir 34.2 de base 10 a base 8. Primero se convierte la parte entera: 34 ÷ 8 → cociente = 4, residuo = 2 4 ÷ 8 → cociente = 0, residuo = 4 Y luego la parte fraccionaria: 0.2 × 8 = 1.6 → entero = 1, fracción 0.6 0.6 × 8 = 4.8 → entero = 4, fracción 0.8 0.8 × 8 = 6.4 → entero = 6, fracción 0.4 0.4 × 8 = 3.2 → entero = 3, fracción 0.2 0.2 × 8 = 1.6 → entero = 1, fracción 0.6 0.6 × 8 = 4.8 → entero = 4, fracción 0.8 En este momento nos podemos dar cuenta que la fracción octal es cíclica. Por lo tanto, 34.210 se puede representar como 42.14638 con 4 dígitos de precisión o más precisamente como 42.14638 . 2.2. De otra base a base 10 La conversión de números de otra base a base 10 fue presentada informalmente en los ejemplos de la Sección 1. Formalmente, para convertir un número en base r, formado por n dígitos enteros y m fraccionarios an−1 an−2 ...a1 a0 .b0 b1 ...bm−2 bm−1 , a base 10, se aplica la siguiente ecuación: N = an−1 × rn−1 + an−2 × rn−2 + ... + a1 × r1 + a0 × r0 + b0 × r−1 + b1 × r−2 + ... + bm−2 × r−(m−1) + bm−1 × r−m Donde N es el número en base 10. Como ejemplo, considere la conversión del número hexadecimal 25A.CC a base 10. 5 N = 2 × 162 + 5 × 161 + 10 × 160 + 12 × 16−1 + 12 × 16−2 = 512 + 80 + 10 + 0.75 + 0.046875 = 602.79687510 2.3. Conversión de base r a base s El método más sencillo para convertir un número de base r a base s es utilizar la base 10 como base intermedia. Esto es, el número original en base r se convierte a base 10 como se explicó en la Sección 2.2 y luego el número decimal se convierte a base s siguiendo el procedimiento visto en la Sección 2.1. 2.4. Conversión rápida entre base 2 y bases 8 y 16 Para el caso particular de convertir números de base 2 a base 8 o 16 y viceversa, existen métodos de conversión directos para evitar utilizar la base 10 como base intermedia. A continuación se describen primero los métodos de conversión entre base 2 y base 8, y en seguida los métodos de conversión entre base 2 y base 16. Para convertir un número de base 2 a base 8 se sigue el siguiente procedimiento. Primero, si el número de dígitos en la parte entera o en la parte fraccionaria del número binario no es múltiplo de tres, se agregan ceros suficientes a la izquierda de la parte entera o a la derecha de la parte fraccionaria cuidando de no alterar el valor del número. Segundo, los dígitos del número binario se agrupan en bloques de tres dígitos. Finalmente, el número octal se obtiene cambiando cada bloque de tres dígitos binarios por un dígito octal de acuerdo al Cuadro 2. Como ejemplo, se muestra la conversión del número binario 1011.01 a octal. 1011.012 = 001011.010 Después de agregar ceros a la izquierda y derecha. = 001 011 . 010 Después de agrupar los dígitos binarios. = 13.28 Después de cambiar los dígitos usando el Cuadro 2. La conversión de un número de base 8 a base 2 sigue el procedimiento inverso. Cada dígito octal se cambia por tres dígitos binarios de acuerdo al 6 Cuadro 2: Conversión entre base 2 y base 8. Binario 000 001 010 011 100 101 110 111 Octal 0 1 2 3 4 5 6 7 Cuadro 2. Por ejemplo, la conversión del número octal 242.52 a binario es como sigue. 242.528 = 010 100 010 . 101 010 Después de cambiar los dígitos usando el Cuadro 2. = 10100010.101012 Después de eliminar los ceros superfluos. La conversión de base 2 a base 16 es similar a la conversión de base 2 a base 8 descrita arriba. Las únicas diferencias son que los bloques tienen cuatro bits binarios y que cada bloque se cambia por un dígito hexadecimal usando el Cuadro 3. En el ejemplo que sigue, se muestra la conversión del número binario 101110.01 a hexadecimal. 101110.012 = 00101110.0100 Después de agregar los ceros necesarios. = 0010 1110 . 0100 Después de agrupar los dígitos binarios. = 2E.416 Después de cambiar los dígitos usando el Cuadro 3. Finalmente, para convertir un número de base 16 a base 2 cada dígito hexadecimal se sustituye por cuatro dígitos binarios de acuerdo al Cuadro 3. Así, la conversión del número hexadecimal 72.E5C a binario es como se muestra a continuación. 72.E5C16 = 0111 0010 . 1110 0101 1100 = 1110010.11100101112 Después de cambiar los dígitos usando el Cuadro 3. Después de eliminar los ceros superfluos. 7 Cuadro 3: Conversión entre base 2 y base 16. Binario 0000 0001 0010 0011 0100 0101 0110 0111 Hexadecimal 0 1 2 3 4 5 6 7 Binario 1000 1001 1010 1011 1100 1101 1110 1111 Hexadecimal 8 9 A B C D E F Cuadro 4: Suma de dos dígitos binarios. x 0 0 1 1 3. y 0 1 0 1 x+y 0 1 1 0 Acarreo 0 0 0 1 Aritmética binaria En los sistemas digitales las operaciones aritméticas se realizan en binario porque es más fácil diseñar circuitos digitales para realizar aritmética binaria que aritmética decimal. Estas operaciones aritméticas incluyen la suma (Sección 3.1), resta (Sección 3.2), multiplicación (Sección 3.3) y división (Sección 3.4). Las operaciones se hacen del mismo modo que en el sistema decimal, pero debido a la sencillez del sistema binario, pueden hacerse algunas simplificaciones que facilitan la realización de las operaciones. 3.1. Suma La suma de dos dígitos binarios, x y y (ver Cuadro 4), involucra el concepto de acarreo (carry en inglés). El acarreo se presenta cuando se suma 1 + 1 cuyo resultado, 2 en decimal, se escribe con dos dígitos en binario (10). En este caso la suma es 0 y se pasa (o se acarrea) 1 a la siguiente columna. Como ejemplo considere la suma binaria de 11001 y 1101. 8 Cuadro 5: Resta de dos dígitos binarios. x y 0 0 0 1 1 0 1 1 x−y 0 1 1 0 Préstamo 0 1 0 0 110010 ← acarreos 11001 + 1101 100110 Los acarreos, presentados en rojo, muestran si en la columna anterior hubo acarreo (valor de 1) o no (valor de 0). 3.2. Resta La resta de números binarios es similar a la resta decimal que conocemos. Cuando al restar dos números binarios nos encontramos con la operación 0 − 1 se genera un préstamo de la siguiente columna (ver Cuadro 5). Al continuar con la siguiente columna hay que tomar en cuenta el préstamo, y si es necesario volver hacer un préstamo de la columna que sigue. Si el préstamo se propaga hasta la última columna entonces el resultado de la resta es un número negativo. La representación en binario de números negativos se presenta en [1]. Para una explicación más extensa del concepto de préstamo, consultar Roth [2, p. 11]. Como ejemplo considere la resta binaria de 111001 y 1011. 011100 ← préstamos 111001 + 1011 101110 Los préstamos, presentados en rojo, muestran si en la columna anterior hubo un préstamo (valor de 1) o no (valor de 0). 9 Cuadro 6: Multiplicación de dos dígitos binarios. x 0 0 1 1 3.3. y 0 1 0 1 x×y 0 0 0 1 Multiplicación En la multiplicación de números binarios sólo es necesario recordar la tabla de multiplicación que se exhibe en el Cuadro 6. Como ejemplo se presenta la multiplicación de 1111 por 1101. Nótese como para evitar sumas de varios dígitos binarios se hacen sumas parciales, denotadas en rojo, después de cada dos números generados. El producto final se muestra en azul. 1111 × 1101 1111 Primer producto parcial 0000 Segundo producto parcial 01111 Primera suma parcial 1111 Tercer producto parcial 1001011 Segunda suma parcial 1111 Cuarto producto parcial 11000011 Producto final 3.4. División La división binaria es más sencilla que la división decimal porque solo hay dos posibles valores para el cociente: 0 si el divisor es menor que el dividendo, y 1 en caso contrario. Como ejemplo a continuación se muestra la división de 10010001 entre 1011. 10 1101 10010001 1011 1110 1011 1101 1011 10 Al finalizar la división, se obtiene que el cociente es 1101 y el resto o residuo es 10. 1011 11 Referencias [1] Héctor Antonio Villa Martínez. Representación de números en binario. Technical report, Universidad de Sonora, Hermosillo, Sonora, 2008. [2] Charles H. Roth Jr. Fundamentos de diseño lógico. Thomson, México, DF, quinta edition, 2005. 12