Entender los números mágicos del código
& 0xFF, >>> 24, | (1 << 3), 0o644: después de los niveles 11–15 verás de un vistazo qué bits toma o enciende cada fragmento.
Guide
El Curso de bases numéricas y bits es un tutorial interactivo de 17 niveles que convierte el «sistema binario» de concepto abstracto en interruptores que se tocan con el dedo: escribes un número y sus cuatro escrituras (binaria, octal, decimal y hexadecimal) cambian a la vez; enciendes o apagas un bit y el valor se actualiza al instante; haces AND / OR / XOR / desplazamientos con dos números y el resultado se alinea bit a bit; escribes un decimal y lo ves desglosado en signo, exponente y mantisa, junto con el decimal exacto al que equivale en doble precisión. Cada nivel tiene un objetivo concreto —convertir un número, componer 200, escribir el complemento a dos de -5, calcular 5 << 3— y el evaluador responde al momento.
Actualizado el 2026-09-094 sources16 min read
El Curso de bases numéricas y bits es un tutorial interactivo de 17 niveles que convierte el «sistema binario» de concepto abstracto en interruptores que se tocan con el dedo: escribes un número y sus cuatro escrituras (binaria, octal, decimal y hexadecimal) cambian a la vez; enciendes o apagas un bit y el valor se actualiza al instante; haces AND / OR / XOR / desplazamientos con dos números y el resultado se alinea bit a bit; escribes un decimal y lo ves desglosado en signo, exponente y mantisa, junto con el decimal exacto al que equivale en doble precisión. Cada nivel tiene un objetivo concreto —convertir un número, componer 200, escribir el complemento a dos de -5, calcular 5 << 3— y el evaluador responde al momento.
El curso se divide en cuatro bloques: conversión de bases (binario ↔ decimal, potencias de 2, por qué el hexadecimal y el octal son una «taquigrafía»); números con signo (cómo el complemento a dos convierte la resta en suma, por qué el desbordamiento hace que 127 + 1 pase a -128); operaciones de bits (máscaras con AND, poner bits con OR, invertir con XOR, multiplicar y dividir con desplazamientos y su aplicación directa en los bits de permisos de Linux 755); y coma flotante (el diseño de campos de IEEE 754 y el verdadero motivo de que 0.1 + 0.2 !== 0.3).
Se completa en unos 45 minutos. Está pensado para quienes empiezan a programar, para desarrolladores que preparan entrevistas y para quien tiene que consultar 0x1F, & 0xFF o chmod 644 cada vez que los ve; no hace falta base matemática, basta con saber sumar.
0x.?lesson=n lleva directo a un nivel.Arriba tienes el curso completo: cambia valores, pulsa interruptores y responde.
El nivel 9, «Completa a dos», pide escribir el complemento a dos de -5 en 8 bits:
El nivel 16, «Campos IEEE 754», acepta 0,15625 y el panel muestra:
Valor absoluto 5 0 0 0 0 0 1 0 1
Negación bit a bit 1 1 1 1 1 0 1 0
Más uno 1 1 1 1 1 0 1 1 ← respuesta 11111011
Comprobación sin signo 251; con signo 251 − 256 = −5 ✓0.15625 = 0.00101₂ = 1.01₂ × 2⁻³
Signo 0
Exponente −3 + 127 = 124 = 01111100 ← respuesta 124
Mantisa 01000000000000000000000 (1 inicial implícito)
32 bits 0 01111100 01000000000000000000000 = 0x3E200000Cualquier base es una «suma de pesos posicionales». En decimal, 203 = 2×100 + 0×10 + 3×1; en binario, 1011 = 1×8 + 0×4 + 1×2 + 1×1 = 11. De derecha a izquierda los pesos son 1, 2, 4, 8, 16, 32, 64, 128…: pasar de binario a decimal es sumar los pesos de los bits que valen 1, y pasar de decimal a binario, dividir entre 2 y anotar los restos, o restar de mayor a menor las potencias de 2 (los interruptores del nivel 7 son justo eso, visualizado).
es solo un 2,4 % más que 1000, y por eso en los primeros tiempos se usaba KB para 1.024 bytes. De ahí viene una confusión que sigue viva: los fabricantes de discos etiquetan 1 GB como y los sistemas operativos calculan con , así que un disco de 500 GB aparece como 465 GiB. Para arreglarlo, la IEC definió KiB, MiB y GiB (prefijos binarios); Linux y macOS ya los van adoptando, mientras Windows sigue mostrando GB aunque calcule GiB. Merece la pena memorizar unos cuantos números: , , y .
El binario es demasiado largo para leerlo con la vista. El hexadecimal (0–9 más A–F) representa 4 bits con un solo símbolo, justo dos por byte: 11111111 = FF, 10110110 = B6. No hace falta pasar por el decimal: basta con cortar el binario en bloques de 4 bits de derecha a izquierda y consultar la tabla, que es lo que se practica en el nivel 5. El octal representa 3 bits por símbolo y se usó en máquinas de 12, 24 y 36 bits; hoy sobrevive sobre todo en los permisos de Linux (755) y en el escape \012 de C. En el código, los prefijos son 0x para hexadecimal, 0o para octal y 0b para binario.
Cada entero no negativo tiene una única escritura binaria, así que un número de 8 bits sirve como 8 interruptores independientes (bits de bandera): flags = READ | WRITE, if (flags & EXEC). El font-weight de CSS, los permisos de archivos de Unix o los campos de banderas de las cabeceras de red se empaquetan así. En el nivel 7 hay que componer 200 solo con clics en los interruptores: de mayor a menor, 200 ≥ 128 (se enciende), quedan 72 ≥ 64 (se enciende), quedan 8 = 2³ (se enciende) y sale 11001000.
¿Cómo se guarda un número negativo? Lo intuitivo es reservar un bit para el signo, pero así habría dos ceros («+0» y «−0») y el circuito de suma tendría que distinguir casos. El complemento a dos (two's complement) establece que el bit más alto vale 1 en los negativos y que el valor es el valor sin signo menos . En 8 bits, 11111111 es 255 y también 255 − 256 = −1; 10000000 es −128. Para hallar el complemento a dos de un número negativo: escribe su valor absoluto, niega todos los bits y suma uno; −5 es 00000101 → 11111010 → 11111011.
La elegancia del complemento a dos es que la suma no necesita saber el signo: −5 + 5 = 11111011 + 00000101 = 1 00000000, y al descartar el acarreo del noveno bit queda exactamente 0. La resta se convierte así en «sumar el complemento» y la CPU solo necesita un sumador. El rango de 8 bits en complemento a dos va de −128 a 127: hay un negativo más que positivos, porque el 0 ocupa un hueco del lado positivo.
El ancho es finito y, si te pasas dándole vueltas, vuelves al principio. En int8, 127 = 01111111, y al sumar uno sale 10000000, que en complemento a dos se lee como −128. Los desbordamientos en C, Java y Go ocurren así, en silencio; en JavaScript el Number normal es de coma flotante y no se desborda, pero Int8Array, |0 y todas las operaciones de bits funcionan en complemento a dos de 32 bits, y (2 ** 31) | 0 da −2147483648. El famoso problema del año 2038 es un contador de segundos de 32 bits con signo que se desborda a negativo el 2038-01-19 03:14:07 UTC; lo de los juegos antiguos con «puntuación que se vuelve negativa» o «monedas a cero» es exactamente lo mismo.
Las tres operaciones lógicas bit a bit tienen usos fijos:
| Operación | Regla | Uso habitual |
|---|---|---|
AND & |
1 solo si ambos bits son 1 | enmascarar bits: x & 0x0F toma los 4 bits bajos; IP & máscara da la dirección de red; n & 1 dice si es par o impar |
OR | |
1 si lo es cualquiera de los dos | poner bits: flags | READ activa una bandera sin tocar las demás |
XOR ^ |
1 si los bits son distintos | invertir / restaurar: x ^ m ^ m = x; cuaderno de un solo uso, sumas de comprobación, intercambio sin variable temporal |
«Apagar» un bit es la combinación de AND con NOT: flags & ~FLAG. Las dos identidades del XOR, y , son el origen de todos sus usos: a ^= b; b ^= a; a ^= b intercambia dos números, y para encontrar el único elemento que aparece un número impar de veces en un array basta con ir aplicando XOR a todos.
Desplazar a la izquierda n bits es multiplicar por (los bits bajos se rellenan con 0), y desplazar a la derecha equivale a dividir entre redondeando hacia abajo. 5 << 3 = 101000 = 40. Desplazar es la multiplicación y la división más barata, pero el uso más frecuente es empaquetar campos pequeños en un entero: (r << 16) | (g << 8) | b junta tres valores de 0 a 255 en un color de 24 bits, y a la inversa (rgb >> 8) & 0xFF saca el verde. Ojo: hay dos desplazamientos a la derecha; el aritmético >> conserva el bit de signo (un negativo sigue siendo negativo) y el lógico >>> rellena con 0. En JavaScript los desplazamientos se hacen en 32 bits: 1 << 31 da −2147483648 y 1 << 32 es como 1 << 0 = 1, porque la cantidad se toma módulo 32.
Los permisos de archivo de Linux son 9 bits: tres para el propietario, tres para el grupo y tres para el resto, y en cada grupo lectura r = 4, escritura w = 2 y ejecución x = 1. La suma de cada trío es un dígito octal: rwxr-xr-x = 7, 5, 5 → 755; rw-r--r-- = 644. Es el uso más directo de los pesos posicionales y las máscaras en el día a día: chmod u+x es un OR con 0o100 y chmod o-w es un AND con ~0o002. Delante pueden aparecer más bits (el 10–12: setuid, setgid y sticky), y por eso a veces se ve un número de cuatro cifras como 4755.
Un flotante es la notación científica del binario:
En precisión simple, 32 bits = 1 de signo s + 8 de exponente e (sesgo 127) + 23 de mantisa f; en doble precisión, 64 bits = 1 + 11 (sesgo 1023) + 52. La mantisa solo guarda la parte fraccionaria: el 1 de la parte entera va implícito y se gana un bit de precisión gratis. El exponente se guarda con sesgo para que comparar flotantes bit a bit sea monótono igual que con enteros. 0,15625 = = ; el campo del exponente es −3 + 127 = 124 = 01111100, y el de la mantisa es 01 seguido de ceros.
Algunas codificaciones especiales: exponente todo 0 es subnormal (valores extremadamente próximos a 0 y ±0); exponente todo 1 con mantisa todo 0 es ±∞; exponente todo 1 con mantisa distinta de 0 es NaN. Por eso 0/0 es NaN y 1/0 es Infinity, y por eso NaN tiene muchos patrones de bits y todos «distintos de sí mismos».
Una fracción binaria solo puede representar con exactitud sumas de potencias negativas de 2: 0,5, 0,25, 0,125… en binario es un decimal periódico infinito y la mantisa de 52 bits tiene que redondear. Así, el 0,1 de doble precisión es exactamente
un poco mayor que 0,1; el 0,2 también queda algo por encima; al sumarlos y redondear sale 0,3000000000000000444…, mientras que el valor de doble precisión más cercano al literal 0,3 es 0,29999999999999998889…: dos números binarios distintos, así que 0.1 + 0.2 === 0.3 es false. No es un bug de JavaScript: cualquier lenguaje con IEEE 754 (Python, Java, C, Go) hace lo mismo.
La solución depende del caso: para dinero, usa céntimos enteros o una biblioteca decimal (decimal, BigDecimal, Decimal.js); para comparar, usa un margen Math.abs(a − b) < ε; para mostrar, redondea solo al final con toFixed(2); para contar, usa enteros, porque la doble precisión representa exactamente todos los enteros hasta y a partir de ahí toca BigInt. La pregunta de opción múltiple del último nivel, «¿el 0,1 guardado es mayor o menor que el valor real?», se responde «mayor»: basta mirar los 55511… a partir del dígito 18 del desarrollo exacto.
BigInt.Math.fround ni media precisión o bfloat16.0x.10000000 es −128 y no −0; el −1 es todo unos.>> es dividir entre 2»: con negativos redondea hacia abajo, no hacia cero: −5 >> 1 da −3 y Math.trunc(−5 / 2) da −2.toFixed ya se arreglan los importes»: toFixed solo redondea al mostrar, y el error de las operaciones intermedias ya se ha acumulado; el dinero debe tratarse con céntimos enteros desde el principio.Int32Array y | 0 funcionan en complemento a dos de 32 bits y se desbordan; un Number pierde precisión entera por encima de .& 0xFF, >>> 24, | (1 << 3), 0o644: después de los niveles 11–15 verás de un vistazo qué bits toma o enciende cada fragmento.
El desbordamiento del nivel 10 y el redondeo del 17 explican la gran mayoría de estos bugs: en el primer caso, cambia a un tipo más ancho o a BigInt; en el segundo, a céntimos enteros o a una biblioteca decimal.
La máscara de subred es una máscara AND (nivel 11): 192.168.1.37 & 255.255.255.0 = 192.168.1.0; y el significado de chmod 755 / 644 y el motivo de que un script «no tenga permiso de ejecución» están en el nivel 15.
El complemento a dos, el desbordamiento, el intercambio con XOR, las multiplicaciones por desplazamiento, los campos de IEEE 754 y 0.1 + 0.2 son las preguntas básicas más frecuentes; el evaluador de cada nivel es un autotest.
En casi todos los niveles se pueden omitir los ceros a la izquierda (1011 y 00001011 valen igual); los niveles marcados como «complemento a dos de 8 bits» exigen exactamente 8 bits, porque el ancho forma parte de la respuesta.
0x?No distingue: ff, FF y 0xFF se aceptan igual.
Son dos lecturas de la misma cadena de bits: sin signo toma el bit más alto como y con signo lo toma como . 11111111 en 8 bits es 255 sin signo y −1 con signo.
Se expanden la mantisa y el exponente de la doble precisión según su definición como número racional y se hace una división larga para obtener todas las cifras decimales: no es una aproximación, es la representación decimal exacta de ese número binario.
En el localStorage del navegador actual, sin subir nada; el enlace de «Compartir este nivel» solo lleva el número de nivel, no el progreso.
El curso funciona por completo en local: la conversión de bases, las operaciones de bits, el desglose de campos de coma flotante y los desarrollos exactos son cálculos puros dentro de la página, sin peticiones al servidor; el progreso se guarda en el localStorage del equipo.
chmod — definición de los modos simbólico y octal: https://pubs.opengroup.org/onlinepubs/9799919799/utilities/chmod.html(consultado el 2026-09-09)Actualizado el 2026-09-09
17 niveles: conversión binario/octal/hexadecimal, interruptores de bits, complemento a dos y desbordamiento, AND/OR/XOR/desplazamientos, bits de permisos chmod, desglose de IEEE 754 y el misterio de 0,1 + 0,2
Esta herramienta no está traducida por completo; parte del contenido usa el idioma de origen o uno de reserva.
ObjetivoEl panel de valores muestra binario 1011. ¿Qué es en decimal?
El valor posicional de cada dígito es una potencia de 2: el más a la derecha es 2⁰=1, luego 2, 4, 8, 16... Agregue los pesos cuyo bit es 1: 1011 = 8 + 0 + 2 + 1 = 11. Al hacer clic en cualquier bit en el panel, se actualiza el decimal inmediatamente: una forma más rápida de desarrollar la intuición que memorizar reglas.