FlowingDev

Bases Numéricas, Explicadas: Por Qué las Computadoras Cuentan Raro

Aprende cómo funcionan los sistemas de bases numéricas como binario, octal, decimal y hexadecimal para representar el mismo número de diferentes maneras, un concepto clave en la computación.

Probar la herramienta: Conversor de Bases

En una frase

La conversión de bases numéricas es el arte de traducir un número de un sistema de conteo (como nuestro familiar sistema decimal de diez dígitos) a otro (como el binario de dos dígitos, nativo de las computadoras), sin cambiar su valor real.

El problema que resuelve

Los humanos, en su mayoría, tenemos diez dedos. Este hardware biológico hizo que contar en grupos de diez —el sistema decimal o de base 10— se sintiera increíblemente natural. Tenemos diez símbolos únicos (del 0 al 9), y una vez que llegamos al nueve, damos la vuelta: añadimos un nuevo dígito a la izquierda y empezamos de nuevo en cero. Diez es 10, cien es 100, y así sucesivamente. Pan comido.

Las computadoras, por otro lado, tienen "dedos" diferentes. Su hardware fundamental es el transistor, un interruptor microscópico que puede estar encendido (on) o apagado (off). Eso es todo. Dos estados. Esto hace que un sistema de dos símbolos —el binario o de base 2— sea el lenguaje nativo de la computadora. Los dos símbolos son 0 (apagado) y 1 (encendido).

Esto crea un problema de traducción. Para una computadora, el número humano 237 no tiene sentido. Necesita ser representado como una serie de encendidos y apagados. Ese mismo número, 237, en binario es 11101101.

Mientras que las computadoras dominan el binario, los humanos... no tanto. Leer una larga cadena de unos y ceros es la receta para un dolor de cabeza y fatiga visual. Para cerrar esta brecha, los desarrolladores idearon atajos convenientes: octal (base 8) y hexadecimal (base 16). Estas bases de "potencia de dos" son triviales de convertir desde y hacia binario, pero comprimen largas cadenas binarias en trozos mucho más legibles.

Las bases numéricas existen para resolver este desajuste fundamental entre cómo los humanos piensan en los números y cómo las máquinas los almacenan físicamente. Son la piedra de Rosetta que nos permite echar un vistazo a la mente de la máquina sin perdernos en un mar de unos y ceros.

Cómo funciona por debajo del capó

La magia detrás de cualquier base numérica es un concepto llamado notación posicional. La posición de un dígito determina su valor. Vamos a desglosarlo.

¿Y qué es una "base"?

Piensa en el odómetro de tu auto. Cuando el dígito de más a la derecha pasa de 9 a 0, el dígito a su izquierda sube en uno. El "lugar" de cada dígito representa una potencia de diez.

El número 427 en nuestro sistema de base 10 de todos los días realmente significa:

  • 4 centenas (4 × 10²)
  • 2 decenas (2 × 10¹)
  • 7 unidades (7 × 10⁰)

Súmalos: 400 + 20 + 7 = 427.

Una "base" es simplemente el número que elevamos a una potencia para cada posición. Para la base 10, es 10. Para binario (base 2), es 2. Para hexadecimal (base 16), es 16. La fórmula es la misma, solo cambia la base (b):

... + (dígito × b²) + (dígito × b¹) + (dígito × b⁰)

De nuestro mundo (Decimal) al suyo (Cualquier Base)

Convirtamos nuestro número decimal 427 a binario (base 2). El algoritmo es "dividir repetidamente por la base de destino y registrar el residuo".

División Resultado Residuo
427 ÷ 2 213 1
213 ÷ 2 106 1
106 ÷ 2 53 0
53 ÷ 2 26 1
26 ÷ 2 13 0
13 ÷ 2 6 1
6 ÷ 2 3 0
3 ÷ 2 1 1
1 ÷ 2 0 1

Ahora, lee los residuos de abajo hacia arriba.

Entonces, el decimal 427 es el binario 110101011.

Este método funciona para cualquier base. Para convertir 427 a hexadecimal (base 16), solo tienes que dividir por 16. (Nota: En base 16, necesitamos más de 10 símbolos, así que usamos A para 10, B para 11, ..., hasta F para 15).

  • 427 ÷ 16 = 26 con un residuo de 11 (que es B en hex).
  • 26 ÷ 16 = 1 con un residuo de 10 (que es A en hex).
  • 1 ÷ 16 = 0 con un residuo de 1.

Leyendo de abajo hacia arriba nos da 1AB. Entonces, el decimal 427 es 1AB en hex.

De su mundo (Cualquier Base) de vuelta al nuestro (Decimal)

Para hacer el camino inverso, usamos la fórmula de notación posicional que vimos antes. Convirtamos el binario 110101011 de nuevo a decimal. Multiplicamos cada dígito por 2 elevado a la potencia de su posición (empezando desde 0 a la derecha).

  1 * 2^8 = 256
+ 1 * 2^7 = 128
+ 0 * 2^6 = 0
+ 1 * 2^5 = 32
+ 0 * 2^4 = 0
+ 1 * 2^3 = 8
+ 0 * 2^2 = 0
+ 1 * 2^1 = 2
+ 1 * 2^0 = 1
----------------
Total     = 427

¡Funciona! Probemos con el hex 1AB:

  1 * 16^2 = 256
+ A * 16^1 = (10 * 16) = 160
+ B * 16^0 = (11 * 1)  = 11
-------------------------
Total      = 427

¡Boom! El mismo número, con otro traje.

El Atajo del Hexadecimal y el Octal

¿Y para qué molestarse con el hex y el octal? Porque son bases de "potencia de dos".

  • Octal es base 8, y 8 = 2³. Esto significa que cada dígito octal se corresponde perfectamente con un grupo de tres dígitos binarios.
  • Hexadecimal es base 16, y 16 = 2⁴. Esto significa que cada dígito hexadecimal se corresponde perfectamente con un grupo de cuatro dígitos binarios (llamado "nibble").

Tomemos un número binario grande: 1101011101001111 Para leer esto, un humano tiene que revisar cada dígito. Pero para convertirlo a hexadecimal, solo tienes que agruparlo en bloques de cuatro desde la derecha:

1101 | 0111 | 0100 | 1111

Ahora, convierte cada bloque:

  • 1101 es 8+4+0+1 = 13, que es D
  • 0111 es 0+4+2+1 = 7
  • 0100 es 0+4+0+0 = 4
  • 1111 es 8+4+2+1 = 15, que es F

Así que, 1101011101001111 es simplemente D74F en hex. Infinitamente más legible y menos propenso a errores. Esto no es solo un cálculo; es una transcripción directa. Por eso a los desarrolladores nos encanta el hexadecimal: es el envoltorio perfecto y legible para datos binarios.

Historias del mundo real

El Caso del Color Críptico

Un desarrollador front-end junior recibe un mockup de un diseñador de UI. El color primario de la marca aparece como #E63946. El desarrollador sabe que es un tono de rojo, pero ¿cuánto rojo? ¿Y qué hay de los otros colores? Mete el código hexadecimal en un conversor. E63946 son en realidad tres números hexadecimales separados: E6 para Rojo (Red), 39 para Verde (Green) y 46 para Azul (Blue).

  • E6 en hex se convierte a 230 en decimal. Ok, así que es mucho rojo (de un máximo de 255).
  • 39 en hex se convierte a 57 en decimal. Un poquito de verde.
  • 46 en hex se convierte a 70 en decimal. Un poquito de azul.

Al desglosar el código hexadecimal, el desarrollador entiende la composición del color. No es solo "rojo", es "principalmente rojo, con una pequeña y similar cantidad de verde y azul para que sea menos chillón".

La lección: El hexadecimal es el lenguaje del color en la web. Entenderlo te ayuda a ir más allá de copiar y pegar códigos y a comprender de verdad los colores con los que trabajas.

El Rompecabezas de los Permisos del Sistema de Archivos

Un sysadmin está intentando asegurar un script recién subido, deploy.sh, en un servidor Linux. Necesita que el propietario pueda leer, escribir y ejecutarlo, pero que el grupo y todos los demás solo puedan leerlo y ejecutarlo. Ha visto el comando chmod 755 deploy.sh por todas partes, pero siempre lo ha tratado como un conjuro mágico.

Esta vez, lo busca. El número 755 es octal. Representa tres conjuntos de permisos: Propietario (Owner), Grupo (Group) y Otros (Others).

  • El permiso del propietario es 7. En binario, 7 es 111.
  • El permiso del grupo es 5. En binario, 5 es 101.
  • El permiso de "Otros" es 5. En binario, 5 es 101.

Cada dígito binario corresponde a un permiso específico: leer (r), escribir (w) y ejecutar (x).

  • 111 significa rwx (Leer, Escribir, Ejecutar están todos ACTIVADOS).
  • 101 significa r-x (Leer y Ejecutar están ACTIVADOS, Escribir está DESACTIVADO).

Entonces, chmod 755 establece los permisos a rwxr-xr-x, que es exactamente lo que se necesitaba. Misterio resuelto.

La lección: El octal proporciona un atajo súper conciso para gestionar los permisos de archivo, que son fundamentalmente un conjunto de banderas (flags) de encendido/apagado (bits).

El Bug del Bit Invertido

Un desarrollador que construye un sistema embebido para un termostato inteligente necesita guardar la configuración del dispositivo en un pequeño trozo de memoria. Para ahorrar espacio, usa un solo byte (8 bits) como un "registro de banderas" (flag register). Cada bit representa una configuración: isHeating (calefacción), isCooling (refrigeración), fanOn (ventilador encendido), hasWifiConnection (conexión WiFi), etc.

Un día, llueven los reportes de bugs: "¡Cuando enciendo el ventilador, la calefacción también se activa!". El desarrollador está perplejo. El código para encender el ventilador parece correcto. Pero cuando inspecciona el byte de configuración en la memoria, ve el problema. Digamos que el ventilador es el segundo bit (valor 2¹ = 2) y la calefacción es el tercer bit (valor 2² = 4). Se suponía que el código debía establecer el byte en ...010 (ventilador encendido). En cambio, lo estaba estableciendo en ...110 (ventilador encendido Y calefacción encendida). El valor decimal habría sido 6 en lugar de 2, lo cual no es obvio a primera vista. Pero mirar la representación binaria 00000110 hizo que el problema fuera clarísimo: se estaban invirtiendo dos bits en lugar de uno. Una operación bitwise defectuosa era la culpable.

La lección: Para la programación de bajo nivel, el debugging de memoria o el trabajo con registros de hardware, pensar en binario no es opcional, es la única manera de ver lo que está sucediendo realmente.

Errores y trampas comunes

  • Olvidar los prefijos. En muchos lenguajes de programación (como C, Java o JavaScript), un número que empieza con 0 se interpreta como octal. ¡010 no es diez, es ocho! Un número que empieza con 0x es hexadecimal. 0x10 es dieciséis. No saber esto puede llevar a bugs realmente salvajes.
  • Confundir O/0 y I/1. Cuando te quedas mirando largas cadenas hexadecimales o binarias, es fácil que se te nuble la vista y confundas la letra O con un cero, o la I con un uno. El hexadecimal no usa O ni I, pero otras conversiones de base podrían hacerlo, y es un clásico error de "dedo gordo" (fat-finger).
  • Asumir un estándar para bases > 16. Los caracteres para binario (0-1), octal (0-7), decimal (0-9) y hexadecimal (0-9, A-F) están estandarizados. Pero ¿qué pasa con la base 22 o la base 36? La mayoría de los sistemas usan 0-9 seguido de A-Z, pero no es una ley universal. Siempre verifica el conjunto de caracteres (o "alfabeto") que se está utilizando cuando trates con bases menos comunes.
  • Ignorar los límites de los enteros. Un número hexadecimal de 64 bits como 0x7FFFFFFFFFFFFFFF representa un número gigantesco. Si intentas convertirlo y guardarlo en una variable de entero estándar de 32 bits en tu programa, no cabrá. Esto causará un "desbordamiento de entero" (integer overflow), donde el número se da la vuelta a un valor negativo o lanza un error.

Por qué debería estar en tu radar

Incluso si no eres un programador de bajo nivel en C, te toparás con diferentes bases numéricas constantemente. Deberías pensar en ellas cada vez que estés:

  • Eligiendo un color en CSS o en una herramienta de diseño (#RRGGBB).
  • Manejando valores hasheados como claves de API o los SHA de los commits de Git, que casi siempre están en hexadecimal.
  • Configurando permisos en un servidor web (chmod).
  • Trabajando con formatos de datos de bajo nivel, protocolos de red o cualquier cosa que use máscaras de bits (bitmasks), como por ejemplo, los feature flags.
  • Encontrando códigos de error o direcciones de memoria en un debugger.
  • Intentando entender cómo funcionan realmente las computadoras. Es un concepto fundamental que desmitifica mucha de la magia digital.

Para profundizar

  • Notación posicional (Wikipedia): El clavado académico a la teoría detrás de todos los sistemas de bases numéricas.
  • Hexadecimal (Wikipedia): Un excelente resumen de la base 16, su historia y sus usos comunes en la computación.
  • **MDN Web Docs: <color>: La guía definitiva para desarrolladores web sobre los valores de color en CSS, incluyendo una explicación detallada de la notación hexadecimal (#RRGGBB).
  • Página del manual de chmod: El manual canónico de Linux para el comando chmod, que detalla el uso del octal para establecer permisos de archivo.
  • Operaciones bitwise en JavaScript (MDN): Una guía práctica que muestra cómo se realizan las manipulaciones a nivel de bit en un lenguaje de alto nivel, un escenario común para aplicar el conocimiento de la base 2.

Teoría lista. Hora de ensuciarse las manos — 100% en tu navegador.

Probar la herramienta: Conversor de Bases