¿Alguna vez te has sentido limitado para formar números con sólo 10 cifras numéricas? ¿O has querido representar números grandes con menos dígitos? ¿O identificar fácilmente los valores de los bytes sin tener que mirar la hipnótica cadena de 1 y 0 de un binario? Para este tipo de aplicaciones, el hexadecimal suele ser el sistema numérico elegido por los ingenieros.

El hexadecimal -también conocido como hex o base 16- es un sistema que podemos utilizar para escribir y compartir valores numéricos. En ese sentido, no es diferente del más famoso de los sistemas numéricos (el que usamos todos los días): el decimal. El decimal es un sistema numérico de base 10 (perfecto para seres con 10 dedos), y utiliza una colección de 10 dígitos únicos, que pueden combinarse para representar números.

El hexadecimal, al igual que el decimal, combina un conjunto de dígitos para crear números grandes. Sucede que el hexadecimal utiliza un conjunto de 16 dígitos únicos, utiliza el estándar 0-9, pero también incorpora seis dígitos adionales que denotaremos con las letras: A, B, C, D, E y F.

Hay muchos (¡infinitos!) otros sistemas numéricos. El binario (base 2) también es popular en el mundo de la ingeniería, porque es el lenguaje de los ordenadores. El sistema de base 2, binario, utiliza sólo dos dígitos (0 y 1) para representar los números.

El hexadecimal, junto con el decimal y el binario, es uno de los sistemas numéricos más comunes en el mundo de la electrónica y la programación. Es importante entender cómo funciona el hexadecimal, porque, en muchos casos, tiene más sentido representar un número en base 16 que con binario o decimal.

En este tutorial

Este tutorial cubre todo lo relacionado con los números hexadecimales que puedes encontrar en la electrónica o la programación. Está dividido en las siguientes secciones:

  • Fundamentos de Hex — Una visión general del hexadecimal. Esta página cubre los 16 dígitos del número, cómo representamos los números hexadecimales, y cómo contar en hexadecimal.
  • Conversión a/desde decimal — Esta página cubre nuestros métodos preferidos de conversión entre hex y decimal.
  • Convertir a/desde binario — Esta página muestra cómo se puede convertir entre binario y hexadecimal.
  • Calculadoras de conversión — Aquí encontrarás una calculadora sencilla y automática para cambiar entre hex, binario y decimal.

Lecturas recomendadas

Deberías saber un par de cosas sobre los números decimales antes de adentrarte en este tutorial. ¿Recuerdas la división larga? ¿Los restos? ¿Los cocientes? ¿Productos? ¿Suma? ¿Exponentes? Todo eso te vendrá a la cabeza cuando aprendas sobre el hexadecimal y su relación con el decimal.

Te recomendamos leer el siguiente tutorial antes de continuar para entender el sistema de números binario

Conceptos básicos de hexadecimal

Esta sección cubre los fundamentos del hexadecimal, incluyendo una visión general de los dígitos que usamos para representar números hexadecimales y las herramientas que usamos para indicar que un número es un valor hexadecimal. También cubrimos una conversión “decimal-a-hex” muy simple en forma de conteo hexadecimal.

Los dígitos: 0-9 y A-F

El hexadecimal es un sistema numérico de base-16. Esto significa que hay 16 dígitos posibles para representar números. 10 de los valores numéricos que probablemente estés acostumbrado a ver en números decimales: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9; esos valores siguen representando el mismo valor al que estás acostumbrado. Los seis dígitos restantes están representados por A, B, C, D, E y F, que corresponden a los valores 10, 11, 12, 13, 14 y 15.

Probablemente encontrarás representaciones de la A-F tanto en mayúsculas como en minúsculas. Ambas funcionan. No hay mucha norma en cuanto a mayúsculas y minúsculas. A3F es el mismo número que a3f es el mismo número que A3f.

Subíndices

El decimal y el hexadecimal tienen 10 dígitos en común, por lo que pueden crear muchos números de aspecto similar. Pero el 10 en hexadecimal es un número totalmente diferente al de decimal. De hecho, el 10 hexadecimal es equivalente al 16 decimal. Necesitamos una forma de indicar explícitamente si un número del que estamos hablando es de base 10 o de base 16 (o de base 8, o de base 2). Introduce los subíndices de base:

Como verás más adelante, los subíndices no son la única forma de indicar explícitamente la base de un número. Los subíndices son sólo el sistema más literal que podemos utilizar.

Contar en hexadecimal

Contar en hexadecimal es muy parecido a contar en decimal, excepto que hay seis dígitos más con los que lidiar. Una vez que el lugar de un dígito es mayor que “F”, se pasa ese lugar a “0” y se incrementa el dígito de la izquierda en 1.

Vamos a contar un poco:

DecimalHexadecimalDecimalHexadecimal
0088
1199
2210A
3311B
4412C
5513D
6614E
7715F

Una vez que hayas llegado a F16, al igual que rodaría de 910 a 1010 en decimal, rodará hasta 1016

DecimalHexadecimalDecimalHexadecimal
16102418
17112519
1812261A
1913271B
2014281C
2115291D
2216301E
2317311F

Y una vez que hayas llegado a 1F16, pasa a 2016 y sigue batiendo el dígito más a la derecha de 0 a F.

Identificadores hexadecimales

Para evitar situaciones confusas, normalmente verás un número hexadecimal precedido (o sufijado) por uno de estos identificadores:

IdentifierExampleNotes
0x0x47DEEste prefijo aparece mucho en UNIX y en los lenguajes de programación basados en C (¡como Arduino!)
##FF7734Referencias de color en programas de edición de imágenes y HTML.
%%20A menudo se utiliza en las URL para expresar caracteres como “Espacio” (%20).
\x\x0AA menudo se utiliza para expresar códigos de control de caracteres como “Retroceso” (\x08), “Escape” (\x1B) y “Avance de línea” (\x0A).
&#x&#x3A9Se utiliza en HTML, XML y XHTML para expresar caracteres unicode (por ejemplo, Ω imprime una Ω).
0h0h5EPrefijo utilizado por muchas calculadoras gráficas programables (por ejemplo, TI-89).
Numera/Texto SubscriptBE3716, 13FhexSe trata más bien de una representación matemática de los números de base 16. Los números decimales se pueden representar con un subíndice 10 (base 10). El binario es de base 2.

Hay una variedad de otros prefijos y sufijos que son específicos de ciertos lenguajes de programación. Los lenguajes ensambladores, por ejemplo, pueden utilizar un sufijo “H” o “h” (por ejemplo, 7Fh) o un prefijo “$” ($6AD). Consulta los ejemplos si no estás seguro de qué prefijo o sufijo debes utilizar con tu lenguaje de programación.

El prefijo “0x” es uno de los que verás a menudo, especialmente si estás haciendo alguna programación en Arduino. Lo usaremos a partir de ahora en este tutorial.

En resumen: ¿DECAF? Una horrible abominación de café. ¿0xDECAF? Un número hexadecimal de 5 dígitos perfectamente aceptable.

Convertir a/desde Decimal

A estas alturas, ya sabemos cómo convertir unos 16 valores entre decimal y hexadecimal. Para convertir números más grandes, aquí hay algunos trucos que utilizamos.

Conversión de decimal a hexadecimal

La conversión de decimal a hexadecimal implica un montón de divisiones y residuos. Si has eliminado la división larga de tu cerebro, wikipedia siempre estará ahí para ayudarte a repasar.

Los pasos para convertir un número, llamémoslo N, de decimal a hexadecimal son los siguientes

  1. Dividir N entre 16. El resto de esa división es el primer dígito (el menos significativo/más a la derecha) de tu número hexadecimal. Lleva el cociente (el resultado de la división) al siguiente paso. Nota: si el resto es 10, 11, 12, 13, 14 o 15, entonces se convierte en el dígito hexadecimal A, B, C, D, E o F.
  2. Divide de nuevo el cociente del último paso entre 16. El resto de esta división es el segundo dígito de su valor hexadecimal (el segundo por la derecha). Lleva el cociente de esta división al siguiente paso.
  3. Divide el cociente del paso 2 entre 16 de nuevo. El resto de esta división es el tercer dígito de su conversión hexadecimal. ¿Notas un patrón?
  4. Sigue dividiendo tu cociente del último paso entre 16, y almacenando el resto hasta que el resultado de la división sea 0. El resto de esa división es el dígito más significativo de la izquierda de tu valor hexadecimal.

Ejemplo de conversión de decimal a hexadecimal: Convertir 61453

Basta de hablar de matemáticas, vamos a trabajar con un ejemplo. Convirtamos 6145310 a hexadecimal:

  1. Divida 61453 entre 16. El resultado es un cociente de 3840, y un resto de 13. Ese resto se convierte en nuestro primer dígito hexadecimal, el más a la derecha, el menos significativo: D. Lleva 3840 al siguiente paso.
  • Ahora divide 3840 entre 16. El cociente resultante es 240 con un resto de 0. Nuestro segundo dígito hexadecimal es 0, y llevamos 240 al siguiente dígito.
  • Divide 240 entre 16, y obtendrás 15 con otro resto 0. Nuestro tercer dígito hexadecimal es 0, y lleva 15 al paso 4.
  • Por último, divide 15 entre 16. Eso producirá el cociente 0 que hemos estado esperando, con un resto de 15. Ese resto significa que el dígito hexadecimal para esta posición es F.

Finalmente, combina los cuatro dígitos hexadecimales para crear nuestro valor hexadecimal: 0xF00D.

Conversión de hexadecimal a decimal

Hay una fea ecuación que rige la conversión de hex a decimal:

Hay algunos elementos importantes en esta ecuación. Cada uno de los factores h (hn, hn-1) es un solo dígito del valor hexadecimal. Si nuestro valor hexadecimal es 0xF00D, por ejemplo, h0 es D, h1 y h2 son 0, y h3 es F.

Las potencias de 16 son una parte fundamental del hexadecimal. Los dígitos más significativos (los que están hacia la izquierda del número) se multiplican por potencias de 16 más grandes. El dígito menos significativo, h0, se multiplica por 160 (1). Si un valor hexadecimal tiene cuatro dígitos, el dígito más significativo se multiplica por 163, es decir, por 4096.

Para convertir un número hexadecimal en decimal, hay que introducir los valores de cada uno de los factores h en la ecuación anterior. A continuación, multiplica cada dígito por su respectiva potencia de 16 y suma cada producto. Nuestro enfoque paso a paso es:

  • Empieza con el dígito más a la derecha de tu valor hexadecimal. Multiplícalo por 160, es decir: multiplica por 1. En otras palabras, déjalo, pero mantén ese valor a un lado.
  • Recuerda convertir los valores hexadecimales alfabéticos (A, B, C, D, E y F) a su equivalente decimal (10, 11, 12, 13, 14 y 15).
  • Mueve un dígito a la izquierda. Multiplica ese dígito por 161 (es decir, multiplica por 16). Recuerda ese producto y mantenlo a un lado.
  • Mueve otro dígito a la izquierda. Multiplica ese dígito por 162 (256) y guarda ese producto.
  • Continúa multiplicando cada dígito incremental del valor hexadecimal por potencias crecientes de 16 (4096, 65536, 1048576, …), y recuerda cada producto.
  • Una vez que hayas multiplicado cada dígito del valor hexadecimal por la potencia de 16 adecuada, súmalos todos. Esa suma es el equivalente decimal de tu valor hexadecimal.

Ejemplo de conversión de hex a decimal: Convertir 0xC0DE

Aquí hay un ejemplo de un valor hexadecimal de cuatro dígitos, 0xC0DE, que queremos convertir a decimal. Crear una tabla y ordenar los dígitos en columnas separadas puede facilitar el proceso de conversión:

Notas
Posición digital(n)3210Estos valores se asignan estáticamente, crecen hacia la izquierda.
Digitos Hex  ordenadosC0DEEsta parte es fácil, introduce tus valores hexagonales de derecha a izquierda.
Convertir A-F1201314Convertir los valores hexadecimales A-F en 10-15.
Mutiplica por 16n12 × 1630 × 16213 × 16114 × 160El exponente de 16 es la posición, n.
Resultados49152020814El producto de un dígito hexadecimal por la potencia de 16.
Suma de todos los productos49374Nuestro equivalente decimal.

Ahí lo tienes. C0DE16 = 4937410

Este método de tabla es perfecto para mantener todos los dígitos hexadecimales, posiciones y potencias de 16 en línea. Para convertir números hexadecimales más grandes, sólo tienes que añadir una columna a la izquierda y aumentar n.

Ahora que sabes cómo hacerlo a mano, ahórrate un poco de tiempo y utiliza una calculadora.

Puedes utilizar la calculadora de Windows para realizar estas conversiones, solo debes ponerla en el modo Programador

Conversión a/de binario

¡Respira tranquilo! Ya nos hemos quitado de encima las conversiones difíciles. En la ingeniería eléctrica e informática utilizamos el hexadecimal porque es increíblemente fácil de convertir a y desde el binario, el lenguaje de 1 y 0 de los ordenadores.

Convertir entre hexadecimal y binario es fácil, porque cada dígito de un número hexadecimal se “asigna” a cuatro bits (un bit es un dígito binario individual) de un valor binario. Así, un byte -ocho dígitos binarios- siempre puede representarse con dos dígitos hexadecimales. Esto hace que el hexadecimal sea una forma realmente genial y concisa de representar un byte o un grupo de bytes.

Conversión de binario a hexadecimal

Comencemos por mapear los primeros 16 valores hexadecimales a binarios.

DecimalHexBinaryDecimalHexBinary
00000000881000
01100010991001
022001010A1010
033001111B1011
044010012C1100
055010113D1101
066011014E1110
077011115F1111

A medida que crezcas y sigas utilizando el hexadecimal y el binario, estos 16 valores se arraigarán en tu cerebro. Son la clave para convertir entre hex y binario.

Para convertir entre binario y hexadecimal, queremos aprovechar el hecho de que cuatro dígitos binarios (bits) se corresponden con un dígito hexadecimal. Sigue estos pasos para convertir de binario a hexadecimal.

  • Divida un valor binario en grupos de cuatro, empezando por el lado derecho.
  • Para cada grupo de cuatro, consulta la tabla anterior para encontrar el valor hexadecimal correspondiente y sustituye los grupos de cuatro dígitos binarios por el valor hexadecimal.

Ya está. Vamos a probarlo.

Ejemplo de conversión de binario a hexadecimal: Convertir 0b101111010100001

Para empezar, comience por el extremo derecho del número binario, y ordene los 1’s y 0’s en grupos de cuatro:

Ahora consulte nuestra tabla de dieciséis para convertir los grupos de cuatro a un dígito hexadecimal

¡Y ahí lo tienes! 0b101111010100001 = 0x5EA1.

Convertir de hexadecimal a binario

Convertir de hex a binario es muy parecido a convertir binario a hex. Simplemente toma un dígito hexadecimal y conviértelo en cuatro dígitos binarios. Repítelo hasta que tu número esté lleno de 0’s y 1’s.

Ejemplo de conversión de hex a binario: Convertir 0xDEADBEEF

Para convertir 0xDEADBEEF (un código comúnmente utilizado para indicar un fallo del sistema), comience por ordenar los dígitos en “bins”:

A continuación, convierte cada dígito hexadecimal en cuatro bits:

En otras palabras, 0xDEADBEEF = 0b11011110101101101111101111. Eso es un montón de 1’s y 0’s.

Usar Hex para representar e identificar bytes

Los ejemplos anteriores muestran uno de los mayores poderes del hexadecimal: representar fácilmente los valores de los bytes. El hexadecimal es a menudo más fácil de trabajar porque los valores son más cortos y más memorables que una larga cadena de 1’s y 0’s.

Por ejemplo, el mapa de registros de arriba es del LSM9DS0 (un ingenioso sensor de 9DOF). Enumera las direcciones de los registros, que se utilizan para controlar el sensor, tanto en hexadecimal como en binario. Si quieres acceder al registro CTRL_REG2_G, es mucho más fácil recordar 0x21 que 0b010001, y descubrir un error en el valor hexadecimal es mucho más fácil que en binario. Por esta razón, es mucho más probable que utilicemos valores hexadecimales en nuestro código que sus equivalentes binarios.

Recursos y donde continuar

Entender cómo funciona el hexadecimal es clave para muchas áreas de la electrónica y la programación.

Armado con tu nuevo y brillante conocimiento hexadecimal, aquí hay algunos tutoriales relacionados que puedes querer revisar desde aquí:

Lógica digital y registros de desplazamiento — Estos tutoriales utilizan el hexadecimal como base para conceptos electrónicos más amplios y generales. La lógica digital es el núcleo detrás de toda la toma de decisiones de un ordenador. Los registros de desplazamiento se pueden utilizar para ventilar una sola entrada o salida a 8 o más.

I2C y SPI — Estas interfaces de comunicación casi siempre requieren el uso de hexadecimales de una forma u otra. Los dispositivos que se comunican por SPI o I2C normalmente tienen una lista de registros, que están todos mapeados con direcciones hexadecimales. A los dispositivos I2C se les asignan direcciones únicas de 7 bits, que normalmente se presentan en hexadecimal.

Jimblom. Hexadecimal. Sparkfun.