A primeira vez que uma conversão básica me custou uma noite de trabalho, o culpado foi um bug de permissões. Um script de implantação escreveu modos de arquivo como chmod 755, e um carregador de configuração leu o mesmo valor de um arquivo JSON que o número 755. JSON não tem literal octal. o carregador passou 755 Para um sistema que esperava um modo octal, o modo foi interpretado como decimal 755, e o decimal 755 em binário é 1011110011- dez bobagens em um campo de nove bits. Os arquivos acabaram com permissões que ninguém havia pedido e ninguém conseguia explicar.
É assim que a confusão de base se parece na prática. Quase nunca é um problema de matemática difícil. É um valor correto em uma notação e catastrófico em outra, movendo-se através de um limite onde ninguém anotou qual base foi pretendida. Binary, octal, decimal e hexadecimal são quatro maneiras de escrever o mesmo inteiro, e um computador irá permitir que você misture-os.
Então eu construí o conversor de base numérica em Toolz.dev para ser a coisa que EU realmente alcancei naquele momento: cole um valor, diga em que base ele está e veja-o em todas as outras bases de uma só vez - junto com a contagem de bits, a contagem de bytes e o binário disposto em nibbles para que ele se alinhe com os dígitos hexadecimais acima dele Ele lida com qualquer radix de 2 a 36, ele aceita 0x, 0b, e 0o Prefixos, e ele faz toda a sua aritmética em Bigint, então um hash de 256 bits converte exatamente em vez de se contorcendo silenciosamente em lixo.
tl;dr: Um valor de número & #39; s nunca muda quando você o converte - apenas a notação o faz. O conversor de base numérica Converte números inteiros entre qualquer base de 2 a 36, mostra binário, octal, decimal e hexadecimal simultaneamente, relata o comprimento do bit e do byte, usa o bigint para que a precisão se mantenha em qualquer tamanho e é totalmente executado no navegador.
Principais características
Qualquer base de 2 a 36
Botões de atalho dedicados binário, octal, decimal e hexadecimal obtêm porque são os quatro que aparecem no código real Mas os dropdowns de origem e destino executam toda a gama da base 2 até a base 36 - o teto sendo o ponto em que você fica sem alfanuméricos insensíveis a maiúsculas e minúsculas (dez dígitos mais vinte e seis letras).A base 3, a base 12, a base 20, a base 32 e a base 36 estão todas a um clique de distância, e cada uma renderiza com o padrão 0-9A-Z alfabeto de dígitos.
Aritmética Exata
Esse é o recurso que mais importa e aparece menos em uma cópia de marketing. Os números de JavaScript são dobro do IEEE-754 e representam exatamente os números inteiros apenas até 2^53 − 1, que é 9.007.199.254.740.991. passado isso, parseInt e Number comece o arredondamento - silenciosamente, sem erro, produzindo um valor que parece plausível e está errado A maioria dos conversores de base na web são construídos exatamente nessas funções.
Este analisa dígitos por dígitos em um acumulador Bigint (value = value * base + digit) e renderiza de volta por divisão repetida Não há teto de precisão Um ID de 64 bits, um hash de 256 bits, um módulo RSA, um decimal de 500 dígitos - todos convertem exatamente.
Todas as bases de uma vez
Uma entrada, quatro saídas, ao vivo O painel mostra binário, octal, decimal e hexadecimal simultaneamente, além da base personalizada escolhida se não for uma dessas quatro A maioria das conversões de base são realmente verificações cruzadas - você deseja confirmar que o hex em seu depurador e o decimal em sua linha de log são o mesmo número - e ver todos os quatro de uma só vez transforma uma tarefa de três etapas em um relance.
Comprimento de bits, comprimento de byte e agrupamento de nibagem
A razão pela qual as pessoas convertem em binário geralmente não é uma curiosidade sobre os bits, é uma questão de dimensionamento: isso se encaixa em um byte, em um int de 32 bits, em um curto assinado? O conversor relata o comprimento significativo do bit (255 → 8 bits, 256 → 9 bits) e o comprimento do byte arredondado. A saída binária é preenchida para um número inteiro de petiscos e agrupada em quatros, de modo que cada grupo de quatro bits fica diretamente sob o dígito hexadecimal que codifica.
Perdoando a entrada, erros precisos
Os valores do mundo real chegam com decoração. 0xDEADBEEF De um rastreio de pilha, 0b1010_1111 De um literal de ferrugem, 0o755 De um chmod, FF FF FF Copiado de um editor hexadecimal. Tudo isso é aceito: os prefixos são removidos quando eles concordam com a base selecionada, e os sublinhados e os espaços são tratados como separadores de dígitos.
Quando um dígito é ilegal para a base que você escolheu, o erro o nomeia. escrever à tipologia 1092 na base 8 e você obtém "9" is not valid in base 8. Base 8 uses 0-7.- não é um & quot; input" inválido;, que não informa nada sobre qual caractere olhar.
Suporte a números negativos
Valores negativos convertem e renderizam com um sinal de menos que a principal. Essa é a notação de magnitude do sinal e é a resposta honesta, por motivos abordados na seção de complemento dos dois abaixo.
roda inteiramente no seu navegador
Sem ida e volta na rede, sem upload, sem registro. O resultado é atualizado em cada pressionamento de tecla porque a aritmética está acontecendo a alguns microssegundos de distância, e a página continua funcionando sem nenhuma conexão quando carregada.
Como usar o conversor de base numérica
Etapa 1: digite seu número
Digite ou cole o valor no campo De. Você não precisa primeiro retirar a decoração - 0xFF, 0b1010, 0o755, 1010_1111, e DE AD BE EF são todos aceitos. direção + e - Sinais funcionam. Os zeros à esquerda são inofensivos.
Etapa 2: escolha a base da fonte
Diga ao conversor como ler o que você digitou. Este é o passo que as pessoas pulam, e é o que importa: 101 é 5 em binário, 65 em octal, 101 em decimais e 257 em hexadecimal. Quatro números diferentes, uma sequência de caracteres. Os botões de atalho cobrem o binário, octal, decimal e hex; o menu suspenso cobre tudo de 2 a 36.
Se a base da fonte não conseguir ler um personagem que você digitou, você receberá uma mensagem nomeando esse personagem em vez de uma resposta errada silenciosa.
Etapa 3: escolha a base de destino
Escolha a base que deseja sair O resultado aparece imediatamente e atualiza conforme você digita - não há botão de conversão, porque não há servidor pelo qual esperar O botão de troca inverte a direção e move o resultado para a entrada, que é a maneira mais rápida de arredondar um valor e confirmar que ele sobreviveu.
Passo 4: Leia os painéis
Abaixo da conversão que você obtém:
- Todas as bases de uma vez- o mesmo valor em binário, octal, decimal e hexadecimal, além de sua base personalizada, se você escolher um.
- Comprimento do bit, comprimento do byte, dígitos hexadecimais- os números de dimensionamento.
- binário agrupado- os bits acolchoados e divididos em pontas, alinhados com os dígitos hexadecimais.
Etapa 5: cópia
Copie o resultado nu ou copie a expressão completa (255 (base 10) = FF (base 16)) quando você deseja que a conversão seja auto-documentada em uma mensagem de confirmação, um comentário de código ou um relatório de bug. A segunda opção é aquela a ser usada quando você está explicando um número para outra pessoa, porque ele carrega a base junto com os dígitos.
Como a notação posicional realmente funciona
Cada base que usamos é uma posicional O sistema, o que significa que a contribuição de um dígito depende de onde ele senta. Na base B, vale o dígito na posição I (contando de zero à direita) digit × b^i. Essa única regra gera cada base.
Tome 1.234 em decimal:
1×10³ + 2×10² + 3×10¹ + 4×10⁰ = 1000 + 200 + 30 + 4 = 1234
agora pegue 1A3 Em hexadecimal, onde A é 10:
1×16² + 10×16¹ + 3×16⁰ = 256 + 160 + 3 = 419
mesma regra, base diferente. e 10101111 em binário:
1×2⁷ + 0 + 1×2⁵ + 0 + 1×2³ + 1×2² + 1×2¹ + 1×2⁰ = 128 + 32 + 8 + 4 + 2 + 1 = 175
Os dois algoritmos que saem dessa regra são o conversor inteiro:
Lendo um número na base B é uma dobra da esquerda para a direita. Comece em zero e para cada dígito: value = value × b + digit. Este é o método de Horner, e é por isso que o conversor nunca precisa calcular b^i explicitamente - sem exponenciação, sem ponto flutuante, sem erro acumulado.
Escrevendo um valor na base c é uma divisão repetida. Divida por C, mantenha o restante como o próximo dígito (da direita), repita com o quociente até atingir zero. Os restantes, lidos ao contrário, são os dígitos.
Ambas as operações são exatas em números inteiros, e é por isso que fazê-los no BigInt oferece uma conversão sem arredondamentos em nenhum lugar do pipeline. O valor 123456789012345678901234567890 converte em hexadecimal como 18EE90FF6C373E0EE4E3F0AD2- 97 bits, 13 bytes - e converte de volta exatamente para o decimal com o qual você começou Tente isso em um conversor construído parseInt.
Há um detalhe que merece destaque no alfabeto de dígitos. A base 36 é o teto prático porque é a última base que você pode escrever com alfanuméricos ASCII que não sejam sensíveis a maiúsculas: 0-9 Dá dez dígitos, A-Z dá-lhe vinte e seis mais, e 10 + 26 = 36. empurre passado ele e você precisa de sensibilidade caso (base 62) ou um alfabeto símbolo (Base64), em que ponto você não está mais fazendo notação aritmética - você está fazendo binário-para-codificação de texto, que é um trabalho diferente com regras diferentes Se isso é o que você realmente precisa, use o conversor de base64 em vez disso.
Por que os mapas hexadecimais são tão limpos para o binário
Hex não é popular na programação porque é compacto. A base 10 é mais compacta que a base 16 para o mesmo valor em termos de familiaridade humana e, se a compacidade fosse o objetivo, usaríamos a base 36. Hex won por um motivo estrutural: 16 é 2⁴.
Isso significa que um dígito hexadecimal codifica exatamente quatro dígitos binários - uma mordidela - sem nenhum carry jamais cruzar a fronteira entre eles O mapeamento é uma tabela de pesquisa, não uma operação aritmética:
| binário | bruxa | binário | bruxa |
|---|---|---|---|
| 0000 | 0 | 1000 | 8 |
| 0001 | 1 | 1001 | 9 |
| 0010 | 2 | 1010 | um |
| 0011 | 3 | 1011 | b |
| 0100 | 4 | 1100 | c |
| 0101 | 5 | 1101 | ré |
| 0110 | 6 | 1110 | e |
| 0111 | 7 | 1111 | fósfor |
converter 11111111 dividindo-o em 1111 1111, lendo cada mordiscador da mesa e concatenando: FF. Sem aritmética. converter 0xDEADBEEF para binário expandindo cada dígito: 1101 1110 1010 1101 1011 1110 1110 1111. A estrutura sobrevive.
Porque um byte tem oito bits e um dígito hexadecimal é quatro, Um byte é sempre exatamente dois dígitos hexadecimais. 0x00 completo 0xFF Abrange todos os bytes possíveis, e é por isso que os despejos hexadecimais, endereços MAC, códigos de cores e endereços de memória são todos escritos em hexadecimal. 0xFF diz-lhe num relance que você está olhando para um byte completo Decimal 255 não lhe diz nada do tipo - você tem que saber que 255 é 28 - 1, e você tem que fazer o mesmo recall para 65535 e 4294967295.
Octal funciona com o mesmo princípio com 8 = 2³, então um dígito octal tem exatamente três bits. É exatamente por isso que as permissões de arquivo UNIX são octais: o modo é de três grupos de três bits (leia, escreva, execute para o usuário, grupo, outro), e três bits é um dígito octal. chmod 755 é 111 101 101- e agora os dígitos significam algo em vez de ser um número mágico que você memorizou É também por isso que meu bug de permissões aconteceu: 755 em decimal não é 755 em octal e nada sobre a string 755 anuncia qual é. o conversor de base numérica Existe parcialmente para que você possa resolver essa questão em três segundos.
Complemento de dois, e por que essa ferramenta usa um sinal de menos
entrar -42 e o conversor retorna -101010. Algumas pessoas esperam 11010110 E considere o sinal de menos um bug. Não é, e vale a pena entender o motivo porque é a coisa mais incompreendida sobre o binário.
O complemento de dois não é uma propriedade de um número. É uma propriedade de um registro de largura fixa.
O valor −1 não possui representação binária canônica. Em um registro de complemento de dois 8 bits, é 11111111 (0xFF). Em 16 bits é 0xFFFF. em 32 bits, 0xFFFFFFFF. Em 64 bits, dezesseis Fs. Estas não são quatro maneiras diferentes de escrever o mesmo padrão de bits; são quatro Padrões de bits diferentes, e qual está correto depende inteiramente de uma largura que vive na declaração de tipo, não no número.
Um inteiro de precisão arbitrária - que é o que é um BigInt, e com o que este conversor funciona - não tem largura Portanto, a única representação que é significativa sem contexto adicional é a magnitude do sinal: um sinal de menos seguido pelos dígitos de magnitude & #39; Isso é o que você obtém, e é a resposta honesta, em vez de confiante errada.
quando você fazer Precisa de um padrão de complemento de dois, a receita é simples e você pode executá-la nesta ferramenta:
- Decida sua largura,
nbits. - calcular
2^n + value(comvaluenegativo). Para -42 em 8 bits: 256 − 42 = 214. - Converta 214 para sua base de destino:
11010110Em binário,D6em hex.
O atalho mecânico que você pode ter aprendido - inverter cada bit, em seguida, adicionar um - produz o mesmo resultado, porque inverter todos os n bits de x dá (2^n − 1) − x, e adicionar um dá 2^n − x. A identidade aritmética é a mesma operação; a versão de inversão de bits é exatamente como você faz isso sem um divisor.
Uma referência rápida para as larguras que as pessoas realmente usam:
| largura | Alcance (assinado) | -1 em hexágono | valor mais negativo |
|---|---|---|---|
| 8 bits | -128 a 127 | FF |
80 (-128) |
| 16 bits | -32.768 a 32.767 | FFFF |
8000 |
| 32 bits | -2.147.483.648 a 2.147.483.647 | FFFFFFFF |
80000000 |
| 64 bits | ±9,22 × 10¹⁸ | FFFFFFFFFFFFFFFF |
8000000000000000 |
Observe a assimetria em cada linha: há um valor a mais negativo do que positivo, porque zero ocupa um slot no lado positivo. Essa é a fonte do bug clássico de estouro, onde a negação do número inteiro mais negativo retorna. Se você deseja ver os bits de um valor ou uma string, diretamente, o tradutor binário é a ferramenta complementar para isso.
Para que serve a base 36?
A base 36 parece uma curiosidade e é, na verdade, a mais útil das bases "exóticas", por um motivo: é a notação numérica mais densa que sobrevive a ser dobrada, digitada por um humano e cai em uma URL sem escapar.
Compare o mesmo valor de 64 bits entre as bases:
| base | dígitos necessários para um valor de 64 bits | exemplo |
|---|---|---|
| binário (2) | 64 | 1111... |
| Decimal (10) | 20 | 18446744073709551615 |
| hexadecimal (16) | 16 | FFFFFFFFFFFFFFFF |
| base 36 | 13 | 3W5E11264SGSF |
| base 62 | 11 | sensível a maiúsculas e minúsculas |
A Base 36 gera uma economia de 35% em relação a hexadecimal e 35% em decimal, usando apenas personagens seguros em um caminho de URL, seguros em um nome de arquivo, inequívocos por telefone e idênticos, quer o usuário os digite em maiúsculas ou não. É por isso que ele aparece em IDs de links curtos, números de fatura, códigos de cupom, referências de pedidos e timestamps compactos. Date.now().toString(36) É um truque comum para gerar um ID curto, classificável e tipável por humanos.
O trade-off é legibilidade: 3W5E11264SGSF Não é algo que você pode observar para estruturar da maneira que pode com hex, e não há alinhamento de bits limpo porque 36 não é um poder de dois. Use a base 36 quando o número for um identificador opaco e o objetivo for compacidade. Use o hexadecimal quando a estrutura de bits do número for o ponto.
Casos de uso comuns
Depuração de memória e despejos hexadecimais. Seu depurador mostra 0x7FFE4A3C, seu log mostra 2147330620, e você precisa saber se eles são o mesmo endereço. Cole um, leia o outro.
permissões de arquivo. converter 755 De octal a binário e veja 111 101 101, que são exatamente os nove bits de permissão na ordem em que o campo de modo os define. Esta é a maneira mais rápida de explicar a alguém por que chmod 644 e chmod 664 Diferem por um bit de gravação em grupo.
valores de cores. #FF5733 tem três bytes: vermelho 255, verde 87, azul 51. dividir uma cor hexadecimal em seus componentes decimais é uma conversão de dois dígitos hexadecimais por vez. Para o fluxo de trabalho completo - paletas, contraste, conversão de formato - o seletor de cores Lida com isso de ponta a ponta, mas a aritmética subjacente é exatamente isso.
Máscaras de bits e bandeiras. um campo de bandeiras de 0b00101100 é 0x2C e decimal 44. Quando você está verificando quais sinalizadores estão definidos, o binário é a única forma legível; quando você está escrevendo a constante no código, o hexagonal é. Você precisa de ambos, constantemente.
Trabalho de rede e protocolo. Máscaras de sub-rede, endereços MAC, grupos IPv6, números de protocolo e somas de verificação são hexadecimais ou binários na especificação e decimal em metade do ferramental. Os octetos de endereço IP, em particular, são decimais em notação pontilhada e binários no momento em que você toca em uma máscara.
hashes e identificadores. um SHA-256 a saída tem 64 caracteres hexadecimais - 256 bits, 32 bytes. Convertê-lo em decimal produz um número de 78 dígitos, e é exatamente aí que todo conversor ingênuo quebra, porque é aproximadamente 10^25 vezes maior que o teto inteiro seguro. Se você estiver gerando esses hashes em vez de convertê-los, o gerador de haxixe produz-lhes o lado do cliente.
Problemas de entrevista e curso. A conversão de base é um elemento básico dos fundamentos do CS, e ter uma implementação de referência que mostra o valor em todas as quatro bases comuns de uma só vez - com a contagem de bits - torna a verificação rápida do seu próprio trabalho.
Comparação de base em um relance
| base | citar | dígitos | bits por dígito | onde você vê isso |
|---|---|---|---|---|
| 2 | binário | 0-1 | 1 | Máscaras de bits, bandeiras, registros de hardware |
| 8 | octal | 0-7 | 3 | Permissões de arquivo UNIX, literais C legados |
| 10 | decimal | 0-9 | ~3,32 | Tudo o que um humano escreve |
| 16 | hexadecimal | 0-9, a-f | 4 | Endereços de memória, cores, hashes, bytes |
| 32 | base 32 | 0-9, A-V | 5 | Codificações compactos que não são sensíveis |
| 36 | base 36 | 0-9, a-z | ~5,17 | IDs curtos, códigos de fatura, números seguros para URL |
O & quot; bits por dígito" coluna explica a tabela inteira Bases que são potências de dois (2, 8, 16, 32) têm um número inteiro de bits por dígito, o que significa dígitos mapear em grupos de bits sem transporte cruzando o limite - isso é o que faz hex-to-binário uma pesquisa em vez de um cálculo Bases que não são potências de dois (10, 36) têm um bit fracionário por dígito, razão pela qual a conversão decimal para binário requer genuinamente aritmética e não pode ser feita por substituição.
E a mesma string de entrada pode ser um número legal em várias bases com valores completamente diferentes. 101 É bom ter em mente:
| leia como | apreço |
|---|---|
| binário | 5 |
| octal | 65 |
| decimal | 101 |
| hexadecimal | 257 |
| base 36 | 1.297 |
Cinco números, uma string A base não é uma preferência de exibição - faz parte dos dados, e cada bug neste artigo vem de algum lugar que se esqueceu de anotá-lo.
Para uma visão mais ampla de quais utilitários baseados em navegador valem a pena manter ao alcance, coletei os que uso diariamente em O kit de ferramentas do desenvolvedor web.
FAQ
Como converter decimal para binário?
Divida o número por 2 repetidamente e leia os restos do último para o primeiro. Para 42: 42÷2 = 21 Resto 0, 21÷2 = 10 Resto 1, 10÷2 = 5 Restante 0, 5÷2 = 2 Resto 1, 2÷2 = 1 Resto 0, 1÷2 = 0 Resto 1. Ler os restantes Bottom-up dá 101010. O conversor executa isso na aritmética Bigint, então ele permanece exato para valores muito além de qualquer coisa que uma calculadora de bolso possa conter.
Como faço para converter hexadecimal em decimal?
Multiplique cada dígito hexadecimal por 16 elevado à potência de sua posição, contando de zero à direita e adicione os produtos. FF é (15 × 16) + 15 = 255. 1A3 é (1 × 256) + (10 × 16) + 3 = 419. Defina a base de origem para 16, cole o valor com ou sem um prefixo 0x e o decimal aparece imediatamente.
Como faço para converter binário em hexadecimal?
Agrupe os dígitos binários em petiscos de quatro, começando pela direita, e mapeie cada nibble para um único dígito hexadecimal. 11111111 se divide em 1111 e 1111, que são F e F, então a resposta é FF. O agrupamento funciona porque 16 é 2 para a quarta potência, então um dígito hexagonal codifica exatamente quatro bits e nenhum carry cruza um limite de grupo. É por isso que o hexadecimal é usado para bytes: um byte é sempre exatamente dois dígitos hexagonais.
Por que os programadores usam hexadecimal em vez de decimal?
Porque hex mapeia de forma limpa em binário e decimal não. Um dígito hexagonal tem exatamente quatro bits e um byte é exatamente dois dígitos hexadecimais, então 0xFF é visivelmente um byte completo e 0xDeadBeef é visivelmente quatro bytes. A Decimal não oferece essa estrutura: nada sobre 255 anuncia que preenche um byte. O Hex mantém o layout do bit legível, sendo um quarto do comprimento do binário bruto.
Este conversor pode lidar com números muito grandes?
Sim. Cada valor é analisado dígito por dígito em um bigint, portanto, não há teto 2^53 e nenhum arredondamento de ponto flutuante em qualquer tamanho. Um hash de 256 bits, um módulo RSA completo ou um decimal de 500 dígitos converte exatamente. Os conversores construídos em ParseInt ou number corrompem valores acima de 9.007.199.254.740.991, que é precisamente o intervalo em que um erro é mais difícil de detectar.
Ele suporta números negativos e dois complementos?
Valores negativos são suportados e renderizados com um sinal de menos à esquerda, que é a notação sinal-magnitude Dois & #39; s complemento é deliberadamente não aplicado, porque é uma propriedade de um registro de largura fixa, em vez de um número: - 1 é FF em 8 bits, FFFF em 16 bits, e FFFFFFF em 32 bits Para produzir um padrão de complemento de dois & #39; s, adicione 2 à potência de sua largura escolhida para o valor negativo e converta o resultado - para - 42 em 8 bits, 256 - 42 = 214, que é D6 em hex.
Para que serve a base 36?
A base 36 usa os dígitos 0-9 seguidos pelas letras A-Z, tornando-a a mais densa notação de número que você pode construir a partir de alfanuméricos ASCII que não diferenciam maiúsculas de minúsculas. Ele produz strings curtas e seguras para o uso de maiúsculas e minúsculas, e é por isso que aparece em IDs de link curtos, códigos de fatura, códigos de cupom e timestamps compactos. Um valor de 64 bits leva 13 caracteres de base-36 em vez de 20 dígitos decimais ou 16 dígitos hexadecimais.
O que significa o comprimento do bit e o comprimento do byte?
O comprimento do bits é o número de bits significativos na magnitude do valor, ignorando os zeros à esquerda: 255 tem um comprimento de 8 e 256 tem um comprimento de bit de 9. O comprimento do byte é esse valor arredondado para o próximo múltiplo de oito. Juntos, eles informam o menor tipo de número inteiro em que o valor se encaixa, que geralmente é a razão real pela qual alguém converte um número em binário em primeiro lugar.
Meus dados são enviados a um servidor quando eu converter um número?
não . Cada conversão é calculada em JavaScript em seu navegador, e é por isso que o resultado é atualizado em cada pressionamento de tecla, e não após uma viagem de volta à rede. Nada que você digita é transmitido, registrado ou armazenado, e o conversor continua funcionando sem nenhuma conexão de rede depois que a página é carregada.



