Como Converter um Número Binário para Decimal em Javascript?

Compartilhar

Para converter um número binário para decimal em Javascript, usamos a função parseInt. Essa função tem dois argumentos: uma string com o texto a ser convertido para número, e um argumento chamada em Inglês de radix, que significa a base usada para interpretar o número. No caso de números binários, a base é 2. Se o radix não for definido, seu valor padrão seria 10, que é a base de números decimais. Logo, o código seria:

const emDecimal = parseInt('11111111', 2);
console.assert(emDecimal === 255);

A função parseInt retorna NaN se não for possível converter o valor. Porém, ela não retorna NaN se o valor começar com um dígito válido! Isto é, '$1' é inválido, mas '1$' é válido. A função converterá todos os caracteres válidos até o primeiro caractere inválido da string.

console.assert(isNaN(parseInt('', 2)));
console.assert(isNaN(parseInt('$', 2)));
console.assert(isNaN(parseInt('$1', 2)));
console.assert(parseInt('1$', 2) === 1);
console.assert(isNaN(parseInt('2', 2)));
console.assert(parseInt('12', 2) === 1);
console.assert(parseInt('100021', 2) === 8);
console.assert(parseInt(' \t 1000', 2) === 8);

Como pode ver, a string '100021' é convertida para o número 8 por que a função só converte os caracteres antes do primeiro caractere inválido (o 2'), ou seja, a função só considerou os caracteres '1000', que em binário equivale a 8. Por outro lado, espaços includindo tabs ('\t') são ignorados.

Embora isso possa parecer terrível em termos de validação, é bom lembrar que várias unidades CSS têm um sufixo que não é um dígito. Por exemplo: '20px'. Essa função retornaria o valor 20 nesse caso sem precisar fazer mais nada. Infelizmente não é para isso que estamos usando a função, logo precisaremos fazer mais alguma coisa.

Para validar que a entrada é um número binário válido, o jeito mais prático é usar um regex. Consideramos uma string válida somente se ela tiver os caracteres '0' e '1' do começo até o fim, ou seja:

/^[01]+$/

Em Javascript:

const valido = /^[01]+$/.test(entrada);
let emBinario = NaN;
if(valido) {
    emBinario = parseInt(entrada, 2);
}

Observe que esse regex rejeitará a entrada se ela conter espaços. Para uma melhor experiência de usuário, é uma boa ideia ignorar os espaços no começo e no fim da entrada. O jeito mais fácil de fazer isso é usar a função trim() que retorna uma string sem esses espaços.

entrada = entrada.trim();
const valido = /^[01]+$/.test(entrada);

Comentários

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *