bin_dec_hex - manual de referencia, opciones, ejemplos de comandos


NOMBRE

bin_dec_hex - Cómo usar la notación binaria, decimal y hexadecimal.

DESCRIPCIÓN

La mayoría de la gente usa el sistema de numeración decimal. Este sistema utiliza diez símbolos para representar números. Cuando esos diez símbolos se agotan, comienzan de nuevo y aumentan la posición hacia la izquierda. El dígito 0 solo se muestra si es el único símbolo de la secuencia, o si no es el primero.

Si esto te suena críptico, esto es lo que acabo de decir en números:

            0
            1
            2
            3
            4
            5
            6
            7
            8
            9
           10
           11
           12
           13

etcétera.

Cada vez que se incrementa el dígito nueve, se restablece a 0 y se incrementa (de 0 a 1) la posición anterior (a la izquierda). Entonces, el número 9 se puede ver como 00009 y cuando debemos incrementar 9, lo restablecemos a cero e incrementamos el dígito justo antes del 9 para que el número se convierta en 00010. Los ceros iniciales no los escribimos excepto si es el único dígito (número 0). Y, por supuesto, escribimos ceros si aparecen en cualquier lugar dentro o al final de un número:

"00010" -> " 0010" -> " 010" -> "  10"

pero no

"  1 ".

Esto era bastante básico, ya lo sabías. ¿Por qué lo dije? Bueno, las computadoras generalmente no representan números con 10 dígitos diferentes. Solo usan dos símbolos diferentes, a saber, 0 y 1. Aplique las mismas reglas a este conjunto de dígitos y obtendrá el sistema de numeración binaria:

            0
            1
           10
           11
          100
          101
          110
          111
         1000
         1001
         1010
         1011
         1100
         1101

etcétera.

Si cuentas el número de filas, verás que nuevamente son 14 números diferentes. Los números son los mismos y significan lo mismo que en la primera lista, solo usamos una representación diferente. Esto quiere decir que hay que conocer la representación utilizada, o como se le llama sistema de numeración o base. Normalmente, si no especificamos explícitamente el sistema de numeración utilizado, implícitamente utilizamos el sistema decimal. Si queremos utilizar cualquier otro sistema de numeración, tendremos que dejarlo claro. Hay algunos métodos ampliamente adoptados para hacerlo. Una forma común es escribir 1010(2), lo que significa que escribiste un número en su representación binaria. Es el número diez. Si escribieras 1010 sin especificar la base, el número se interpreta como mil diez utilizando la base 10.

En los libros, otra forma es común. Utiliza subíndices (pequeños caracteres, más o menos entre dos filas). Puede omitir los paréntesis en ese caso y escribir el número en caracteres normales seguido de un pequeño dos justo detrás.

Como el sistema de numeración utilizado también se llama base, hablamos del número 1100 base 2, del número 12 base 10.

Dentro del sistema binario, es común escribir ceros a la izquierda. Los números se escriben en series de cuatro, ocho o dieciséis según el contexto.

Podemos usar la forma binaria cuando hablamos con computadoras (...programación...), pero los números tendrán representaciones grandes. El número 65'535 (a menudo en el sistema decimal se usa un ' para separar bloques de tres dígitos para facilitar la lectura) se escribiría como 1111111111111111(2) que es 16 veces el dígito 1. Esto es difícil y propenso a errores. Por lo tanto, normalmente usaríamos otra base, llamada hexadecimal. Utiliza 16 símbolos diferentes. Primero se utilizan los símbolos del sistema decimal, luego continuamos con los caracteres alfabéticos. Obtenemos 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F. Se elige este sistema porque la forma hexadecimal se puede convertir al sistema binario muy fácilmente (y de vuelta).

Todavía hay otro sistema en uso, llamado sistema octal. Esto era más común en los viejos tiempos, pero ya no se usa con mucha frecuencia. Como puede encontrarlo en uso a veces, debe acostumbrarse y lo mostraremos a continuación. Es la misma historia que con las otras representaciones, pero con ocho símbolos diferentes.

        Binary      (2)
        Octal       (8)
        Decimal     (10)
        Hexadecimal (16)

        (2)    (8) (10) (16)
        00000   0    0    0
        00001   1    1    1
        00010   2    2    2
        00011   3    3    3
        00100   4    4    4
        00101   5    5    5
        00110   6    6    6
        00111   7    7    7
        01000  10    8    8
        01001  11    9    9
        01010  12   10    A
        01011  13   11    B
        01100  14   12    C
        01101  15   13    D
        01110  16   14    E
        01111  17   15    F
        10000  20   16   10
        10001  21   17   11
        10010  22   18   12
        10011  23   19   13
        10100  24   20   14
        10101  25   21   15

La mayoría de las computadoras que se usan hoy en día usan bytes de ocho bits. Esto significa que almacenan ocho bits a la vez. Puedes ver por qué el sistema octal no es el más práctico para eso: necesitarías tres dígitos para representar los ocho bits y esto significa que tendrías que usar un dígito completo para representar solo dos bits (2+3+3 =8). Esto es un desperdicio. Para dígitos hexadecimales, solo necesita dos dígitos que se usan por completo:

        (2)      (8)  (10) (16)
        11111111 377  255   FF

Puede ver por qué el binario y el hexadecimal se pueden convertir rápidamente: para cada dígito hexadecimal hay exactamente cuatro dígitos binarios. Tome un número binario: tome cuatro dígitos de la derecha y haga un dígito hexadecimal a partir de ellos (consulte la tabla anterior). Repita esto hasta que no haya más dígitos. Y al revés: toma un número hexadecimal. Para cada dígito, escriba su equivalente binario.

Las computadoras (o más bien los analizadores que se ejecutan en ellas) tendrían dificultades para convertir un número como 1234 (16). Por lo tanto, los números hexadecimales se especifican con un prefijo. Este prefijo depende del idioma en el que esté escribiendo. Algunos de los prefijos son 0x para C, $para Pascal, # para HTML. Es común suponer que si un número comienza con un cero, es octal. No importa lo que se use, siempre que sepa lo que es. Usaré 0x para hexadecimal, % para binario y 0 para octal. Los siguientes números son todos iguales, solo que su representación (base) es diferente: 021 0x11 17 %00010001

Para hacer aritmética y conversiones necesitas entender una cosa más. Es algo que ya sabes pero quizás aún no lo ves:

Si escribes 1234, (sin prefijo, por lo que es decimal) estás hablando del número mil doscientos treinta y cuatro. En una especie de fórmula:

        1 * 1000 = 1000
        2 *  100 =  200
        3 *   10 =   30
        4 *    1 =    4

This can also be written as:

        1 * 10^3
        2 * 10^2
        3 * 10^1
        4 * 10^0

donde ^significa a la potencia de.

Estamos usando la base 10 y las posiciones 0,1,2 y 3. La posición más a la derecha NO debe multiplicarse por 10. La segunda desde la derecha debe multiplicarse una vez por 10. La tercera desde la derecha se multiplica. con 10 dos veces. Esto continúa para cualquier posición que se utilice.

Es lo mismo en todas las demás representaciones:

0x1234 será

        1 * 16^3
        2 * 16^2
        3 * 16^1
        4 * 16^0

01234 would be

        1 * 8^3
        2 * 8^2
        3 * 8^1
        4 * 8^0

Este ejemplo no se puede hacer para binario ya que ese sistema solo usa dos símbolos. Otro ejemplo:

%1010 sería

        1 * 2^3
        0 * 2^2
        1 * 2^1
        0 * 2^0

Hubiera sido más fácil convertirlo a su forma hexadecimal y simplemente traducir %1010 a 0xA. Después de un tiempo te acostumbras. Ya no necesitará hacer ningún cálculo, pero sepa que 0xA significa 10.

Para convertir un número decimal en hexadecimal, puede usar el siguiente método. Tomará algún tiempo poder hacer las estimaciones, pero será más fácil cuando use el sistema con más frecuencia. Veremos otra forma más adelante.

Primero necesita saber cuántas posiciones se utilizarán en el otro sistema. Para hacerlo, necesita saber los números máximos que usará. Bueno, eso no es tan difícil como parece. En decimal, el número máximo que puedes formar con dos dígitos es 99. El máximo para tres: 999. El siguiente número necesitaría una posición extra. Invierta esta idea y verá que el número se puede encontrar tomando 10 ^3 (10 * 10 * 10 es 1000) menos 1 o 10 ^2 menos uno.

Esto también se puede hacer para hexadecimal:

        16^4 = 0x10000 = 65536
        16^3 =  0x1000 =  4096
        16^2 =   0x100 =   256
        16^1 =    0x10 =    16

Si un número es menor que 65'536, cabe en cuatro posiciones. Si el número es mayor que 4'095, debe usar la posición 4. Cuántas veces puede restar 4'096 del número sin pasar por debajo de cero es el primer dígito que escribe. Siempre será un número del 1 al 15 (0x1 a 0xF). Haz lo mismo para las otras posiciones.

Intentemos con 41'029. Es más pequeño que 16^4 pero más grande que 16^3-1. Esto significa que tenemos que usar cuatro posiciones. Podemos restar 16^3 de 41'029 diez veces sin caer por debajo de cero. Por lo tanto, el dígito más a la izquierda será A, por lo que tenemos 0xA????. El número se reduce a 41'029 - 10*4'096=41'029-40'960=69. 69 es menor que 16^3 pero no mayor que 16^2-1. Por lo tanto, el segundo dígito es 0 y ahora tenemos 0xA0??. 69 es más pequeño que 16^2 y más grande que 16^1-1. Podemos restar 16^1 (que es simplemente 16) cuatro veces y escribir 4 para obtener 0xA04?. Resta 64 de 69 (69 - 4*16) y el último dígito es 5 --> 0xA045.

El otro método construye el número de la derecha. Intentemos 41'029 nuevamente. Divide por 16 y no uses fracciones (solo números enteros).

41029/16 es 2564 con un resto de 5. Escribe 5. 2564/16 es 160 con un resto de 4. Escribe el 4 antes del 5. 160/16 es 10 sin resto. Anteponga 45 con 0. 10/16 está por debajo de uno. Termine aquí y anteponga 0xA. Termina con 0xA045.

Qué método usar depende de usted. Usa lo que funcione para ti. Los uso a ambos sin poder decir qué método uso en cada caso, solo depende del número, creo. El hecho es que algunos números aparecerán con frecuencia durante la programación. Si el número es cercano a uno con el que estoy familiarizado, usaré el primer método (como 32'770 que está en 32'768 + 2 y solo sé que es 0x8000 + 0x2=0x8002).

Para binario se puede utilizar el mismo enfoque. La base es 2 y no 16, y el número de posiciones crecerá rápidamente. Usar el segundo método tiene la ventaja de que puedes ver muy fácilmente si debes escribir un cero o un uno: si divides por dos el resto será cero si es un número par y uno si es un número impar:

        41029 / 2 = 20514 remainder 1
        20514 / 2 = 10257 remainder 0
        10257 / 2 =  5128 remainder 1
         5128 / 2 =  2564 remainder 0
         2564 / 2 =  1282 remainder 0
         1282 / 2 =   641 remainder 0
          641 / 2 =   320 remainder 1
          320 / 2 =   160 remainder 0
          160 / 2 =    80 remainder 0
           80 / 2 =    40 remainder 0
           40 / 2 =    20 remainder 0
           20 / 2 =    10 remainder 0
           10 / 2 =     5 remainder 0
            5 / 2 =     2 remainder 1
            2 / 2 =     1 remainder 0
            1 / 2 below 0 remainder 1

Anota los resultados de derecha a izquierda: %1010000001000101

Agrupar por cuatro:

        %1010000001000101
        %101000000100 0101
        %10100000 0100 0101
        %1010 0000 0100 0101

Convertir a hexadecimal: 0xA045

Agrupa %1010000001000101 por tres y convierte a octal:

        %1010000001000101
        %1010000001000 101
        %1010000001 000 101
        %1010000 001 000 101
        %1010 000 001 000 101
        %1 010 000 001 000 101
        %001 010 000 001 000 101
           1   2   0   1   0   5 --> 0120105

        So: %1010000001000101 = 0120105 = 0xA045 = 41029
        Or: 1010000001000101(2) = 120105(8) = A045(16) = 41029(10)
        Or: 1010000001000101(2) = 120105(8) = A045(16) = 41029

Al principio, mientras sumas números, los convertirás a su forma decimal y luego volverás a su forma original después de hacer la suma. Si usa el otro sistema de numeración con frecuencia, verá que podrá hacer aritmética directamente en la base que se usa. En cualquier representación es lo mismo, sume los números de la derecha, anote el dígito más a la derecha del resultado, recuerde los otros dígitos y utilícelos en la siguiente ronda. Continúe con el segundo dígito de la derecha y así sucesivamente:

           %1010 + %0111 --> 10 + 7 --> 17 --> %00010001

se convertirá

           %1010
           %0111 +
            ||||
            |||+-- add 0 + 1, result is 1, nothing to remember
            ||+--- add 1 + 1, result is %10, write down 0 and remember 1
            |+---- add 0 + 1 + 1(remembered), result = 0, remember 1
            +----- add 1 + 0 + 1(remembered), result = 0, remember 1
                   nothing to add, 1 remembered, result = 1
        --------
          %10001 is the result, I like to write it as %00010001

Para valores bajos, intente hacer los cálculos usted mismo y luego verifíquelos con una calculadora. Cuanto más haga los cálculos usted mismo, más encontrará que no cometió errores. Al final, harás cálculos en otras bases tan fácilmente como los haces en decimal.

Cuando los números crezcan, tendrás que darte cuenta de que una computadora no se llama computadora solo para tener un nombre bonito. Hay muchas calculadoras diferentes disponibles, utilícelas. Para Unix, puede usar bc, que es la abreviatura de Binary Calculator. Calcula no solo en decimal, sino en todas las bases que quieras usar (entre ellas, Binario).

Para usuarios de Windows: inicie la calculadora (inicio->programas->accesorios->calculadora) y, si es necesario, haga clic en ver->científico. Ahora tiene una calculadora científica y puede calcular en binario o hexadecimal.

AUTOR

Espero que hayan disfrutado los ejemplos y sus descripciones. Si lo hace, ayude a otras personas indicándoles este documento cuando hagan preguntas básicas. No solo obtendrán su respuesta, sino que al mismo tiempo aprenderán mucho más.

Alex van den Bogaerdt alex@vandenbogaerdt.nl