El sistema binario es un sistema de numeración en base 2 que representa la información usando solo 0 y 1. El hexadecimal aparece como su mejor aliado, porque nos permite escribir grupos de bits de forma compacta y legible cuando trabajamos con hardware.
Este artículo es clave porque, aunque hoy programemos en alto nivel, cuando bajamos a configurar un microcontrolador nos encontramos con bits, máscaras y registros hexadecimales por todas partes. Si no entiendes esto, un datasheet se convierte en un jeroglífico.
Los humanos contamos en sistema decimal (base 10) por una razón simple: tenemos 10 dedos. Pero las máquinas no tienen dedos. Tienen transistores. Y un transistor funciona fundamentalmente como un interruptor: o está encendido (1) o está apagado (0).
Por eso, para hablar con los procesadores, necesitamos aprender su idioma. Hoy vamos a ver el binario (el idioma del hardware) y el hexadecimal (el idioma de los programadores).
El sistema binario (la realidad física)
El sistema binario es un sistema en base 2. Solo existen dos símbolos: 0 y 1.
Cada dígito binario se llama bit (binary digit).
- 0 lógico: 0 voltios (GND).
- 1 lógico: 5 voltios (o 3.3V).
Agrupando bits
Como un solo bit da poca información, los agrupamos:
- Nibble: 4 bits (ej:
1010). - Byte: 8 bits (ej:
11001010). Es la unidad estándar de almacenamiento. - Word (palabra): 16 o 32 bits, dependiendo de la arquitectura del procesador.
Contando en binario
Funciona igual que el decimal, pero “desborda” mucho antes.
- Decimal: 0, 1, 2… 9 (se acabaron los símbolos)
10. - Binario: 0, 1 (se acabaron los símbolos)
10.
| Decimal | Binario (4 bits) |
|---|---|
| 0 | 0000 |
| 1 | 0001 |
| 2 | 0010 |
| 3 | 0011 |
| 4 | 0100 |
| 5 | 0101 |
Cada posición a la izquierda vale el doble que la anterior (potencias de 2).
1011 = 1 · 8 + 0 · 4 + 1 · 2 + 1 · 1 = 11 en decimal.
El sistema hexadecimal
Los ordenadores no “piensan” en hexadecimal. Piensan en binario. El hexadecimal es un sistema para humanos.
Escribir binario es propenso a errores. Memorizar 1111000010100101 es casi imposible.
Para solucionarlo, usamos el sistema hexadecimal (base 16).
Usamos los números del 0 al 9 y añadimos las letras A, B, C, D, E, F.
La correspondencia clave
Esta es la razón de su existencia. Un dígito hexadecimal representa exactamente 4 bits (un nibble).
| Decimal | Binario | Hexadecimal |
|---|---|---|
| 0-9 | 0000-1001 | 0-9 |
| 10 | 1010 | A |
| 11 | 1011 | B |
| 12 | 1100 | C |
| 13 | 1101 | D |
| 14 | 1110 | E |
| 15 | 1111 | F |
Gracias a esto, podemos comprimir ese número binario horrible de antes:
- Binario:
1111 0000 1010 0101 - Hex: F 0 A 5
Escribir 0xF0A5 es mucho más limpio y fácil de recordar.
¿Por qué es imprescindible para registros?
Cuando programamos microcontroladores a bajo nivel, no usamos funciones genéricas. Manipulamos registros.
Un registro es una fila de interruptores (por ejemplo, 8 bits) que controlan hardware.
Imagina el registro PORTD, que controla pines digitales de un microcontrolador.
Si queremos encender los pines 0, 2, 4 y 6, y apagar los demás, necesitamos enviar este patrón:
0 1 0 1 0 1 0 1 (Binario 01010101).
Podemos escribirlo en código de tres formas:
// 1. Decimal (oculta qué bits están activos)
PORTD = 85;
// 2. Binario (Visual, pero largo)
PORTD = 0b01010101;
// 3. Hexadecimal (compacto)
PORTD = 0x55;Cuando veas código profesional, verás cosas como 0xFF (todos unos, 11111111) o 0x00 (todos ceros).
Saber convertir mentalmente 0xA en 1010 es una habilidad que te ahorrará horas de depuración.
Prefijos en programación
Para que el compilador sepa de qué hablamos:
- 0bxxxx → Binario (Ej:
0b0011) - 0xxxxx → Hexadecimal (Ej:
0x3F) - Sin prefijo → Decimal (Ej:
12)
Correspondencias importantes
- Binario: representa dos estados lógicos mediante intervalos de tensión.
- Hexadecimal: Una forma compacta de representar binario.
- Correspondencia clave: 1 Hex = 4 Bits.
- F = 1111: El “todo encendido” de 4 bits.
- FF = 11111111: El “todo encendido” de un Byte.
Entender esto es el peaje necesario para entrar en la lógica digital. Ahora que sabemos cómo representar los 0s y 1s, vamos a ver qué operaciones podemos hacer con ellos.