Números binarios y hexadecimales explicados para desarrolladores
imágenes falsas
Los sistemas de números binarios y hexadecimales sustentan la forma en que funcionan los sistemas informáticos modernos. Las interacciones de bajo nivel con hexadecimal (hex) y binario son poco comunes en el mundo de la programación Java, pero los desarrolladores de software ocasionalmente operan a nivel de bits y bytes. La capacidad de comprender cómo funcionan estos sistemas numéricos alternativos es una habilidad importante que debe tener un desarrollador de software completo.
Trabajar en hexadecimal o binario puede resultar extraño y confuso en comparación con el sistema numérico de base 10 que se utiliza en nuestro mundo cotidiano. No es ciencia espacial, pero requiere ajustar la forma en que uno piensa sobre los números y las cifras. Los siguientes ejemplos binarios y hexadecimales explican cómo funcionan y se comportan estas alternativas al sistema numérico basado en decimal.
Comencemos a comprender los sistemas numéricos binarios y hexadecimales con un ejemplo del mundo real.
Considere el número 500. En un sistema numérico, cada dígito representa una potencia de la base. Para el sistema numérico de base 10, cada dígito representa una potencia de 10. Así es como la base 10 describe el número 500:
cientos
decenas
unos
102
101
100
5
0
0
En la tabla anterior, la columna de la izquierda describe unidades de 100 (102), la columna del medio describe unidades de 10 (101) y la columna de la derecha describe unidades de uno (100). Así, podemos expresar el valor de 500 en base 10 como cinco unidades de 100, cero unidades de 10 y cero unidades de uno, todo sumado.
La base 10 es excelente para los humanos, pero, por razones relacionadas con los estados de energía encendidos y apagados, las computadoras usan un sistema numérico de base 2. Con base 2, o binario, cada dígito representa una potencia de 2 y los dígitos se describen como solo dos números: 0 y 1. La siguiente tabla muestra la conversión de binario a decimal del valor de 500:
Valores de exponentes expresados en decimal.
256
128
64
32
dieciséis
8
4
2
1
28
27
26
25
24
23
22
21
20
1
1
1
1
1
0
1
0
0
(Nota: una unidad de 20 = 1)
Por lo tanto, 50010 = 1111101002. O, dígito por dígito en base 2: 500 = (256 + 128 + 64 + 32 + 16 + 0 + 4 + 0 + 0)
Hay dos reglas más para calcular números en el sistema binario. Primero, en el mundo de la informática digital, cada dígito de un número en base 2 se llama bit. Así, los siguientes números representan valores de tres bits: 000, 001, 011, 100, 101, 110 y 111. De manera similar, ocho dígitos son valores de ocho bits, como 10101010, junto con 11110000 y 11111111.
En segundo lugar, los bits se agrupan en una unidad organizativa llamada byte. Normalmente, un byte es un grupo de ocho bits, como el número 10101010. Agrupar ocho bits en un byte es convencional, aunque algunas tecnologías, como Protocol Buffers, organizan un byte como un grupo de siete bits.
Trabajar con bits y bytes usando notación binaria puede resultar difícil sólo a nivel visual. Considere la expresión binaria 1001001011011001: un número tan largo es difícil de descifrar para el cerebro de cualquier persona.
Los números binarios pueden ser intimidantemente largos, pero los hexadecimales son exactamente lo contrario. Los números hexadecimales describen un número en menos números que el sistema numérico binario y de base 10.
Lo primero que hay que entender sobre el sistema hexadecimal es que está formado por dieciséis números:
0 1 2 3 4 5 6 7 8 9 abcdef
En cualquier sistema numérico, cada dígito representa una potencia de la base. En el sistema de base 10 (decimal), el número 10 representa una unidad de 101 y cero unidades de 100. En el sistema hexadecimal, el número 10 representa una potencia del número 16, como se muestra en la siguiente tabla:
Valores de exponentes expresados en decimal.
65.536
4.096
256
dieciséis
1
164
163
162
161
160
Así, el decimal 10 describe un valor de 10 en base 10, mientras que en hexadecimales el número 10 se convierte en 16. Podemos ilustrar la conversión así:
Valores de exponentes expresados en decimal.
dieciséis
1
161
160
En hexadecimal
1
0
Esos símbolos numéricos adicionales en hexadecimal (abcdef) ayudan a aliviar la confusión al traducir decimales, como el número 10, al sistema numérico de base 16. La siguiente tabla describe la correlación de símbolos numéricos entre decimal y hexadecimal.
decimal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
hexadecimal
1
2
3
4
5
6
7
8
9
a
b
C
d
mi
F
Así, volviendo al ejemplo decimal con 500, podemos expresarlo en notación hexadecimal como 1f4. La siguiente tabla describe la lógica detrás de esta correlación:
Valores de exponentes expresados en decimal.
256
dieciséis
1
162
161
160
En hexadecimal
1
F
4
Llevemos el ejemplo más allá y convirtamos cada dígito hexadecimal a su equivalente decimal y luego sumémoslos:
(162 x 1) + (160 x 15) + (160 x 4)
= (256 + 240 + 4)
= 500
Lo que es especialmente interesante acerca de la notación hexadecimal y binaria es que un valor hexadecimal simplifica la expresión del valor de los bytes. Cualquier ocho bits de un byte se convierte en un número hexadecimal de uno o dos dígitos.
Por ejemplo, un byte con cuatro bits apagados y cuatro bits encendidos se expresa en binario como 00001111 y se convierte a f en hexadecimal, mientras que un byte de ocho bits "encendido" es 11111111 en binario y ff en hexadecimal.
Usar números hexadecimales para expresar el valor de un byte es una técnica poderosa. Por ejemplo, los ingenieros que trabajan con formatos de serialización como Protocol Buffers y Apache Thrift a nivel de bytes utilizan números hexadecimales todo el tiempo. Cuando los programadores trabajen con los bits reales que representan esos bytes, utilizarán notación binaria.
La capacidad de interpretar y convertir sistemas numéricos binarios y hexadecimales es una buena herramienta que cualquier desarrollador de DevOps debe tener en la caja de herramientas. Puede que hoy en día no esté al nivel de bits y bytes, pero a medida que el alcance de las actividades informáticas para todo tipo de desarrolladores continúa ampliándose, algún día podría hacerlo.
