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);
Deixe um comentário