El sistema hexadecimal¶
El sistema octal tiene una pega: los bytes tienen ocho bits, y lo ideal sería poder coger los dígitos binarios de cuatro en cuatro, en lugar de hacerlo de tres en tres. Esto llevó en su momento a considerar el uso del sistema “hexadecimal” en la escritura de programas.
El sistema de numeración hexadecimal cuenta de 16 en 16. Al igual que hacíamos con los números romanos, utilizaremos letras para algunos símbolos:
decimal: 0 1 2 3 4 5 6 7 8 9
hexadecimal: 0 1 2 3 4 5 6 7 8 9 A B C D E F
Al escribir un programa se suele utilizar indistintamente mayúsculas o minúsculas. Veamos como se cuenta en decimal y en hexadecimal:
Decimal | Hex | Decimal | Hex |
---|---|---|---|
0 | 0 | 20 | 14 |
1 | 1 | 21 | 15 |
2 | 2 | 22 | 16 |
3 | 3 | 23 | 17 |
4 | 4 | 24 | 18 |
5 | 5 | 25 | 19 |
6 | 6 | 26 | 1A |
7 | 7 | 27 | 1B |
8 | 8 | 28 | 1C |
9 | 9 | 29 | 1D |
10 | A | 30 | 1E |
11 | B | 31 | 1F |
12 | C | 32 | 20 |
13 | D | 33 | 21 |
14 | E | 34 | 22 |
15 | F | 35 | 23 |
16 | 10 | 36 | 24 |
17 | 11 | 37 | 25 |
18 | 12 | 38 | 26 |
19 | 13 | 39 | 27 |
Aquí vemos que al llegar al número F
se agotan las posibilidades y pasamos al 10
. Al llegar al 1F
pasaremos al 20, y al llegar al FF
, el número siguiente será el 100.
Cuando escribimos un programa, lo habitual es escribir los números en decimal o en hexadecimal indistintamente. El uso de literales binarios u octales es más infrecuente, y se limita a situaciones puntuales.
Las conversiones de hexadecimal a binario son fáciles. Basta con tomar los bits de cuatro en cuatro y convertirlos de acuerdo a la siguiente tabla:
Binario | Hexadecimal | Binario | Hexadecimal |
---|---|---|---|
0000 | 0 | 1000 | 8 |
0001 | 1 | 1001 | 9 |
0010 | 2 | 1010 | A |
0011 | 3 | 1011 | B |
0100 | 4 | 1100 | C |
0101 | 5 | 1101 | D |
0110 | 6 | 1110 | E |
0111 | 7 | 1111 | F |
De esta forma, todo byte se puede representar con dos dígitos hexadecimales. Es decir:
- en binario, un byte toma valores de
00000000
a11111111
- convirtiendo a decimal, de
0
a255
- en octal, de
0
a377
- en hexadecimal, de
0
aFF
Cada paquete de cuatro bits se denomina nibble. Un byte setá formado por dos nibbles, representado cada uno por un dígito hexadecimal.
Véase que el sistema hexadecimal resulta bastante práctico, una vez que nos acostumbramos a su uso. Para distinguir los literales hexadecimales como tales, es costumbre poner un prefijo, dependiendo del lenguaje de programación. En Java, por ejemplo, se usa el prefijo 0x
. Las cuatro instrucciones siguientes son equivalentes, ya que representan el mismo valor:
x = 51966 (en decinal)
x = 0145376 (en octal)
x = 0b1100101011111110 (binario)
x = 0xCAFE (hexadecimal)
Cualquiera de las cuatro equivale el número binario 1100 1010 1111 1110
, pero si no queremos escribir tantos ceros y unos, el formato hexadecimal es el que más se aproxima a la representación binaria.
Un detalle curioso:
Este ejemplo está sacado del lenguaje de programación Java, cuyo logotipo es una taza de café humeante. Se cuenta que el equipo que diseñó la sintaxis del lenguaje solía ir a almorzar a un lugar llamado St Michael’s Alley, al que solían llamar jocosamente “Café Dead” en recuerdo del grupo Grateful Dead, que solía actuar allí.
Según James Gosling, a quien se considera padre del lenguaje Java, en algún momento se dieron cuenta de que CAFEDEAD
era una secuencia de dígitos hexadecimales, y decidieron adoptarlo como seña de identidad. Pero pasado cierto tiempo les pareció algo siniestro, y buscaron una palabra de cuatro letras para combinar con CAFE. Finalmente se les ocurrió BABE, y decidieron usarlo. En la actualidad, todos los programas Java comienzan con una secuencia de 32 bits que en hexadecimal se representan como CAFEBABE
.