Saltar al contenido principal

Convertir bases numéricas

El conversor de base numérica convierte entre binario, octal, decimal, hexadecimal y cualquier base del 2 al 36, en tu navegador. Los enteros pasan de principio a fin por BigInt en lugar de por un double, porque parseInt devuelve silenciosamente 9007199254740992 para 9007199254740993 — y los valores que la gente convierte son IDs, máscaras de bits y hashes, que es justo el material que supera ese límite.

Solo local

Escribe un número arriba o prueba un ejemplo para convertirlo a binario, decimal, hexadecimal y otras bases.

¿Cómo funciona Convertir bases numéricas?

La conversión de base parece una sola línea y deja de serlo en dos puntos: los enteros grandes y las fracciones.

parseInt pierde dígitos, en silencio

parseInt("9007199254740993", 10) devuelve 9007199254740992. Nada lanza una excepción, nada avisa, y el último dígito simplemente desaparece — porque un número de JavaScript es un double y 2 53 es donde los enteros consecutivos dejan de ser representables. Lo que la gente convierte entre bases son IDs snowflake, máscaras de bits de permisos, hashes y direcciones de memoria, y todos superan eso con regularidad. Así que la ruta de enteros aquí es BigInt desde el parseo hasta el formato y nunca pasa de ida y vuelta por un double.

Las fracciones se convierten por multiplicación repetida

BigInt no tiene parte fraccionaria, así que la fracción se trata por separado: multiplica los dígitos fraccionarios por la base destino, toma el acarreo como el siguiente dígito de salida y repite. Toda la aritmética se queda en enteros en la base origen, así que nada pasa por un float — por eso 0.1 en base 3 sale aquí exactamente 0.1 y no 0.3333333333333333.

Algunas fracciones no terminan en la base destino: 0.1 decimal es 0.0001100110011… en binario, repitiéndose para siempre, el mismo hecho detrás de 0.1 + 0.2 !== 0.3. Nada puede arreglar eso, así que la expansión se limita a cuarenta dígitos y se detiene.

Un 0x inicial que no coincide con la base es un error

Pegar 0x1f con la base 10 seleccionada casi seguro significa que querías la base 16. Tratar 0 y x como dígitos fallaría de forma confusa o produciría una respuesta equivocada, así que la discrepancia se nombra. Los separadores de dígitos — guiones bajos y espacios — se aceptan, porque 1010_1010 es como la gente escribe de verdad un byte.

El complemento a dos es la razón de que -1 se lea como ffffffff

Un entero negativo en memoria se guarda como su complemento a dos: invierte los bits y suma uno. Así, -1 en 32 bits es ffffffff, y -2147483648 es 80000000. Cuando un depurador te muestra un valor hexadecimal positivo enorme donde esperabas uno negativo pequeño, esto es lo que pasó. El panel muestra la codificación con el ancho más estrecho que contiene el valor.

Bits encendidos, para un valor usado como máscara

Un entero de permisos es un conjunto de flags, y la pregunta útil es cuáles están activos. Se listan las posiciones de bit, contando desde cero en el bit menos significativo, que es la convención que usa toda operación de desplazamiento de bits.

Entrada

255 (base 10)

Convertido

binary       1111 1111
octal        377
hexadecimal  ff
set bits     0, 1, 2, 3, 4, 5, 6, 7

¿Qué opciones y casos límite admite Convertir bases numéricas?

Referencia técnica y opciones
ParámetroTipoValor predeterminadoComportamiento y casos límite
Rango de bases2 a 36—Los dígitos son 0–9 y luego a–z, sin distinguir entre mayúsculas y minúsculas, lo que da 36 símbolos. La base 36 es la codificación más densa que utiliza solo caracteres alfanuméricos.
PrecisiónarbitrariaBigIntLos enteros de cualquier longitud se convierten exactamente. parseInt pierde dígitos más allá de 2^53 sin advertencia, lo cual es el error más común en los convertidores de base.
Fraccionesmultiplicación repetida40 dígitos máximoExacto cuando la fracción termina en la base de destino. Cuando no lo hace —como 0.1 decimal en binario— la expansión está limitada en lugar de ser infinita.
Separadores_ y espacioaceptadoTanto 1010_1010 como 1010 1010 se analizan. Rechazarlos sería pedantería; esa es la forma en que las personas escriben un byte.
Prefijos0b 0o 0xverificadoSe aceptan cuando coinciden con la base seleccionada y se reportan como error cuando no coinciden —pegar 0x1f con la base 10 seleccionada es un error que vale la pena nombrar.
AgrupaciónbooleanoactivadoCada 4 dígitos en binario, 3 en octal y decimal, 2 en hexadecimal —los agrupamientos que coinciden con cómo se lee cada base.
Complemento a dos8/16/32/64-bitajuste más estrechoCómo se almacena realmente un valor negativo, por lo que -1 aparece como ffffffff en un depurador.
Ancho de bitscon y sin signoinformadoCuál de int8 hasta uint64 puede contener el valor. Un valor que cabe en int32 pero no en int16 es el tipo de información que conviene conocer antes de elegir un tipo de columna.

Preguntas frecuentes

¿Por qué otros conversores me dan un resultado distinto para un número largo?

Porque usaron parseInt o Number, que pasan por un double y pierden precisión más allá de 2^53 — unos 9 mil billones. parseInt("9007199254740993") devuelve 9007199254740992, sin error. Esta herramienta usa BigInt de principio a fin, así que sobrevive cada dígito. Si estás convirtiendo un ID snowflake, un hash o una máscara de bits grande, esta es la diferencia que importa.

¿Por qué 0.1 no se convierte limpiamente a binario?

Porque no puede. Un décimo es 0.0001100110011… en base 2, repitiéndose para siempre, por la misma razón que un tercio es 0.333… en base 10: el denominador tiene un factor primo que la base no. Esta es toda la explicación de 0.1 + 0.2 !== 0.3 en cada lenguaje con coma flotante binaria. La expansión aquí se detiene en cuarenta dígitos porque tiene que detenerse en algún sitio.

¿Por qué -1 se muestra como ffffffff?

Eso es el complemento a dos, la forma en que esencialmente cualquier equipo guarda un entero negativo: invierte los bits de la magnitud y suma uno. Tiene la buena propiedad de que la suma funciona igual para valores con y sin signo, y por eso se impuso a las alternativas. Cuando un depurador muestra un valor hex positivo sospechosamente grande donde esperabas un número negativo pequeño, esto es lo que estás viendo.

¿Para qué sirve la base 36?

Identificadores compactos. La base 36 usa 0-9 y a-z, el alfabeto más grande que sobrevive a pasarse a minúsculas, a que lo escriba una persona y a meterse en una URL sin codificar. Una marca de tiempo en base 36 mide cerca de la mitad que en decimal. La base 62 es más densa pero distingue mayúsculas de minúsculas, lo que la hace frágil en cualquier sitio que fuerce minúsculas.

¿Puedo convertir el patrón de bits de un número de coma flotante?

No directamente — esto convierte el valor matemático, no la codificación IEEE 754. Son preguntas distintas: 0.5 como valor es 0.1 en binario, mientras que 0.5 como double es 3FE0000000000000 en hex. Si quieres el patrón de bits, convierte el hex de la forma codificada como entero.

¿Se sube mi número?

No. Es aritmética que se ejecuta en tu navegador. Nada en convertir 255 a hexadecimal requiere un servidor, y los números que la gente convierte suelen ser identificadores internos que preferiría no meter en el log de otro.