Conversor Binario
- Binary
10 1010- Octal
52- Decimal
42- Hexadecimal
2a
Complemento a dos
- 8-bit
0010 1010- 16-bit
0000 0000 0010 1010- 32-bit
0000 0000 0000 0000 0000 0000 0010 1010- 64-bit
0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0010 1010
Nada de lo que escribes aquí se almacena, registra ni comparte.
Convierte un número entre binario, octal, decimal y hexadecimal, o convierte texto a binario y de vuelta. Los valores siguen siendo exactos a cualquier tamaño, incluso muy por encima de 64 bits.
Cómo usarlo
- Elige la base en la que estás escribiendo e introduce tu valor.
- Todas las demás bases se muestran a la vez, con el complemento a dos debajo.
- Cambia al modo Texto para convertir palabras a binario y de vuelta.
Por qué la aritmética es exacta
Todas las conversiones se hacen con BigInt, que no tiene límite de tamaño ni redondeo. Parece una nota al pie de la implementación y es, en realidad, lo que más distingue a esta herramienta de la mayoría de conversores de la web.
Los números de JavaScript son dobles IEEE 754, y solo representan enteros con exactitud hasta 9.007.199.254.740.991, que es 2^53 menos uno. Un conversor escrito de la forma obvia acierta por debajo de ese valor y se equivoca en silencio por encima. Es el peor tipo de fallo: sin error ni aviso, solo una respuesta con la longitud y la forma correctas que resulta no ser la correcta.
Ese umbral es lo bastante bajo como para toparse con él continuamente. Un valor completo de 64 bits lo supera con creces. También los ID de base de datos de un generador snowflake, las marcas de tiempo en nanosegundos, los volcados de registros de hardware, los hashes y cualquier cosa leída de una dirección de memoria de 64 bits. Si estás convirtiendo un número lo bastante grande como para que sea interesante, un conversor corriente es justo donde deja de ser fiable.
Complemento a dos
Debajo de las cuatro bases, el valor se muestra tal como se almacenaría en un entero con signo de 8, 16, 32 o 64 bits. No es lo mismo que poner un signo menos delante de los dígitos binarios, y esa diferencia es lo que confunde a la gente al leer memoria.
En complemento a dos, un número negativo se forma invirtiendo todos los bits de su valor absoluto y sumando uno. En ocho bits, -1 es 11111111 y -128 es 10000000. No hay un bit de signo aparte que quitar, no existe el cero negativo y la suma funciona sin tratar el signo como caso especial, por eso todos los procesadores habituales almacenan así los enteros.
También explica el rango asimétrico. Ocho bits representan de -128 a 127 y no de -128 a 128, porque el cero ocupa una de las posiciones del lado positivo. Si el valor no cabe en un ancho, se indica en lugar de truncarlo en silencio, ya que un resultado truncado parece perfectamente válido y no lo es.
Cómo leer la salida
Los valores largos se agrupan para poder leerlos de un vistazo: el binario en bytes de ocho, el hexadecimal por pares y el decimal por miles. La agrupación es solo visual y se elimina de todo lo que copies.
La entrada es deliberadamente tolerante en el mismo sentido. Se aceptan e ignoran los prefijos 0x, 0b y 0o, así como los guiones bajos, espacios y comas usados como separadores, de modo que un literal pegado directamente del código fuente o de un volcado hexadecimal funciona sin limpiarlo antes.
Texto a binario
El modo texto codifica el texto en UTF-8 y después escribe cada byte como ocho bits. En sentido contrario, los bits se vuelven a leer como bytes y se decodifican como UTF-8.
La alternativa - tomar directamente la unidad de código de cada carácter - es lo que hacen la mayoría de herramientas de texto a binario, y falla en dos puntos. Cualquier carácter por encima de U+00FF produce más de ocho bits y ya no encaja con los bytes. Peor aún, los caracteres fuera del plano multilingüe básico, que incluyen la mayoría de los emoji, se almacenan en JavaScript como dos unidades de código sustitutas; tratadas por separado se convierten en dos mitades sin sentido que al otro lado no decodifican nada. Pasar por UTF-8 evita ambos problemas, y por eso aquí un emoji hace el viaje de ida y vuelta y en otros sitios a menudo no. Las tildes y la eñe también vuelven intactas.
Un número, cuatro formas de escribirlo
Toma 2.025. En binario es 11111101001, en octal 3751 y en hexadecimal 7E9. La cantidad no ha cambiado; solo la base con la que se escribe. Los dígitos de cualquier base son valores posicionales: 7E9 es 7x256 más 14x16 más 9, y 11111101001 es la suma de las potencias de dos cuyo bit está activado.
El hexadecimal se gana su sitio porque dieciséis es dos elevado a cuatro, así que un dígito hexadecimal equivale exactamente a cuatro bits y la correspondencia se memoriza: F es 1111, 8 es 1000, A es 1010. Por eso los volcados de memoria, los valores de color, los hashes y las direcciones MAC se escriben en hexadecimal y no en decimal: puedes leer los bits directamente de los dígitos sin hacer ninguna cuenta.
El octal sobrevive sobre todo en un sitio, los permisos de archivo de Unix, por la misma razón: tres bits por dígito encajan perfectamente con lectura, escritura y ejecución, así que 755 es rwxr-xr-x y no hay nada que consultar.
Operaciones bit a bit y para qué sirven las máscaras
Cuando el valor está en binario, los operadores bit a bit resultan evidentes. AND conserva solo los bits activos en ambos operandos, que es como se comprueba una bandera: value AND 0b0100 es distinto de cero exactamente cuando el tercer bit está activo. OR activa bits, XOR los invierte, NOT invierte todo, y desplazar a izquierda o derecha multiplica o divide por potencias de dos.
Por eso las banderas se guardan como bits sueltos y no como booleanos separados. Un campo de permisos, un conjunto de interruptores de funcionalidades o las opciones de un paquete de red caben en un entero, y comprobar una es una sola instrucción. La constante con la que se hace el AND se llama máscara, y escribirla en binario o hexadecimal hace visible su propósito de una forma que el equivalente decimal nunca logra.
Los desplazamientos tienen una trampa que conviene conocer: en la mayoría de lenguajes, un desplazamiento a la derecha sobre un valor con signo conserva el bit de signo, así que -8 desplazado a la derecha es -4 y no un número positivo enorme. Los lenguajes que ofrecen ambos comportamientos escriben el otro de forma distinta, como el operador >>> de JavaScript.
Cómo queda un número en memoria
Un valor escrito como 7E9 no dice cómo está almacenado. El ancho importa: el mismo número ocupa uno, dos, cuatro u ocho bytes según el tipo, y un valor demasiado grande para su ancho se trunca o da la vuelta en lugar de crecer.
El orden de bytes también importa. Las máquinas little-endian, que son casi todas las que te vas a encontrar, guardan primero el byte menos significativo, así que el valor de 32 bits 0x000007E9 aparece en un volcado como E9 07 00 00. El orden big-endian es el inverso y es lo que especifican los protocolos de red, de ahí que se llame orden de bytes de red y que existan funciones de conversión en cada frontera de socket. Leer un volcado sin saber cuál de los dos estás mirando produce un disparate dicho con seguridad.
Los tipos con y sin signo del mismo ancho contienen los mismos bits y los interpretan de forma distinta: 0xFF es 255 como byte sin signo y -1 como byte con signo. Nada en los bytes dice cuál es la lectura correcta; solo lo dice el tipo.
La coma flotante es otro sistema distinto
Todo lo anterior trata de enteros. Un double se almacena como un bit de signo, un exponente de 11 bits y una fracción de 52 bits, lo que significa que representa un número como una fracción multiplicada por una potencia de dos. Los valores que no son exactamente representables así se redondean al más cercano que sí lo es.
Esa es la explicación completa del famoso resultado en el que 0,1 más 0,2 no es 0,3. Un décimo en binario es una fracción periódica, igual que un tercio en decimal, así que se guarda ligeramente desviado, y dos valores ligeramente desviados suman algo ligeramente desviado. La aritmética es correcta; lo que falla es esperar que las fracciones decimales sobrevivan al almacenamiento binario.
De ahí salen las reglas prácticas: no guardes dinero en un float, usa céntimos enteros o un tipo decimal; compara floats con una tolerancia y no con igualdad; y ten presente que los enteros por encima de 2^53 pierden precisión en un double, que es la razón por la que este conversor usa aritmética de precisión arbitraria.
Dónde te encuentras estas bases en la práctica
El hexadecimal aparece siempre que se muestran bytes a una persona. Un color en CSS son tres bytes en hexadecimal; una dirección MAC, seis; un resumen SHA-256, treinta y dos, escritos como sesenta y cuatro caracteres. Las direcciones de memoria, los códigos de error de los sistemas operativos y los registros de hardware también son hexadecimales porque las fronteras de bits coinciden con los dígitos.
El binario aparece donde los bits individuales tienen significado: máscaras de red, registros de hardware, bits de permisos, banderas de funcionalidades y las tablas de codificación de formatos como los códigos QR y UTF-8. Leer UTF-8 es un buen ejemplo de por qué importa la base: un byte que empieza por 0 es ASCII, uno que empieza por 110 inicia una secuencia de dos bytes y uno que empieza por 10 es un byte de continuación. Esa estructura es invisible en decimal y obvia en binario.
El octal se ha replegado en gran medida a los permisos de archivo y a unos pocos formatos heredados, pero conserva una trampa que conviene recordar: en C, en el JavaScript anterior a ES5 y en varios formatos de configuración, un número escrito con un cero inicial es octal, así que 0755 no es setecientos cincuenta y cinco. El JavaScript moderno usa el prefijo explícito 0o, y YAML 1.2 eliminó del todo la regla del cero inicial, lo que a su vez sorprende cuando un modo de archivo se lee como número decimal.
Preguntas frecuentes
- ¿Sigue siendo exacto con números muy grandes?
- Sí. Toda la aritmética usa BigInt, que es exacta a cualquier tamaño. Los conversores construidos sobre números normales de JavaScript pierden precisión por encima de 2^53, unos 9 mil billones, y a partir de ahí devuelven respuestas que parecen plausibles pero son incorrectas. Un valor completo de 64 bits ya supera ese límite, así que esto importa más a menudo de lo que parece.
- ¿Qué es el complemento a dos y por qué mostrarlo?
- Es cómo se almacenan realmente los enteros con signo en memoria. En complemento a dos de 8 bits, -1 es 11111111 y no un bit de signo más un 1. Ver la forma almacenada es lo que necesitas al leer un volcado de registros o depurar un protocolo. Las anchuras en las que el valor no cabe lo indican en lugar de truncar en silencio.
- ¿Puedo pegar valores con prefijos 0x o 0b?
- Sí. Esos prefijos se aceptan y se ignoran, igual que los guiones bajos, espacios y comas usados para agrupar, así que puedes pegar directamente desde el código fuente.
- ¿Cómo se convierte el texto a binario?
- El texto se codifica primero en UTF-8, y luego cada byte se escribe como ocho bits. Eso significa que el japonés, el chino, el coreano y los emoji vuelven intactos. Las herramientas que leen códigos de carácter directamente producen basura con cualquier cosa fuera de ASCII, y un solo emoji acaba en dos mitades rotas.
Última actualización:
Incluye los pasos, el resultado esperado y el real. Elimina secretos y datos personales.
