como converter string binária em decimal?

107

Eu quero converter string binária em dígito, por exemplo

var binary = "1101000" // code for 104
var digit = binary.toString(10); // Convert String or Digit (But it does not work !)
console.log(digit);

Como isso é possível? obrigado


fonte

Respostas:

207

A parseIntfunção converte strings em números e leva um segundo argumento especificando a base na qual a representação da string é:

var digit = parseInt(binary, 2);

Veja em ação .

Jon
fonte
1
Isso ainda é relevante? parseInt(101, 2)retorna 5.
srph
13
@srph: Isso não é surpreendente, 101 na base 2 é 5 na base 10.
Jon
3
Ah, entendo. Devo ter entendido mal o que parseInt. Eu pensei que ele iria converter a string de base 10 -> qualquer (pensando que parseInt('5612', 2)iria retornar sua forma binária;).
srph
1
@baptx qualquer método que retorne um Numberfalhará para valores tão altos (veja esta pergunta e a resposta aceita). Verificando o estado da arte hoje, você deve usar BigInt(que é amplamente suportado). Você pode adaptar diretamente esta resposta aqui , alterando a implementação para usar explicitamente BigInte o operador de exponenciação em **vez de Math.pow, e funcionará.
Jon
1
@baptx Fiz um violino aqui . Não acho que isso, digamos, "extensão" mereça ser incluído na resposta.
Jon
21

ES6 suporta literais numéricos binários para inteiros, portanto, se a string binária for imutável, como no código de exemplo na pergunta, pode-se apenas digitá-la como está com o prefixo 0bou 0B:

var binary = 0b1101000; // code for 104
console.log(binary); // prints 104
GOTO 0
fonte
12

Use o parâmetro raiz de parseInt:

var binary = "1101000";
var digit = parseInt(binary, 2);
console.log(digit);
phihag
fonte
12

parseInt() com radix é a melhor solução (como foi dito por muitos):

Mas se você quiser implementá-lo sem parseInt, aqui está uma implementação:

  function bin2dec(num){
    return num.split('').reverse().reduce(function(x, y, i){
      return (y === '1') ? x + Math.pow(2, i) : x;
    }, 0);
  }
Salvador Dalí
fonte
3
function binaryToDecimal(string) {
    let decimal = +0;
    let bits = +1;
    for(let i = 0; i < string.length; i++) {
        let currNum = +(string[string.length - i - 1]);
        if(currNum === 1) {
            decimal += bits;
        }
        bits *= 2;
    }
    console.log(decimal);
}
Iliyan Shalvarkov
fonte
3
        var num = 10;

        alert("Binary " + num.toString(2));   //1010
        alert("Octal " + num.toString(8));    //12
        alert("Hex " + num.toString(16));     //a

        alert("Binary to Decimal "+ parseInt("1010", 2));  //10
        alert("Octal to Decimal " + parseInt("12", 8));    //10
        alert("Hex to Decimal " + parseInt("a", 16));      //10
Md Shahriar
fonte
2

Eu reuni tudo o que outros sugeriram e criei a seguinte função que tem 3 argumentos, o número e a base de onde esse número veio e a base na qual esse número vai estar:

changeBase(1101000, 2, 10) => 104

Execute o snippet de código para experimentar você mesmo:

function changeBase(number, fromBase, toBase) {
                        if (fromBase == 10)
                            return (parseInt(number)).toString(toBase)
                        else if (toBase == 10)
                            return parseInt(number, fromBase);
                        else{
                            var numberInDecimal = parseInt(number, fromBase);
                            return (parseInt(numberInDecimal)).toString(toBase);
                    }
}

$("#btnConvert").click(function(){
  var number = $("#txtNumber").val(),
  fromBase = $("#txtFromBase").val(),
  toBase = $("#txtToBase").val();
  $("#lblResult").text(changeBase(number, fromBase, toBase));
});
#lblResult{
  padding: 20px;
}
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="txtNumber" type="text" placeholder="Number" />
<input id="txtFromBase" type="text" placeholder="From Base" />
<input id="txtToBase" type="text" placeholder="To Base" />
<input id="btnConvert" type="button" value="Convert" />
<span id="lblResult"></span>

<p>Hint: <br />
Try 110, 2, 10 and it will return 6; (110)<sub>2</sub> = 6<br />

or 2d, 16, 10 => 45 meaning: (2d)<sub>16</sub> = 45<br />
or 45, 10, 16 => 2d meaning: 45 = (2d)<sub>16</sub><br />
or 2d, 2, 16 => 2d meaning: (101101)<sub>2</sub> = (2d)<sub>16</sub><br />
</p>

Para sua informação: se você deseja passar 2d como um número hexadecimal, você precisa enviá-lo como uma string para que fique assim: changeBase('2d', 16, 10)

Muhammad Musavi
fonte
Não lida com números de ponto flutuante. 3.14159265,10,16 dá 3
Mark Manning
1

Outra implementação apenas para prática de JS funcional pode ser

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
onde +cforça o Stringtipo ca um Numbervalor de tipo para adição adequada.

Redu
fonte
0

Algoritmo de conversão binária convencional ligeiramente modificado, utilizando um pouco mais de sintaxe ES6 e recursos automáticos:

  1. Converter string de sequência binária em array (assumindo que já não tenha sido passado como array)

  2. Sequência reversa para forçar o índice 0 a começar no dígito binário mais à direita, pois o binário é calculado da direita-esquerda

  3. A função de matriz 'reduzir' atravessa a matriz, realizando a soma de (2 ^ índice) por dígito binário [somente se dígito binário === 1] (0 dígito sempre resulta em 0)

NOTA: Fórmula de conversão binária:

{onde d = dígito binário, i = índice da matriz, n = comprimento da matriz-1 (começando da direita)}

n
∑ (d * 2 ^ i)
i = 0

let decimal = Array.from(binaryString).reverse().reduce((total, val, index)=>val==="1"?total + 2**index:total, 0);  

console.log(`Converted BINARY sequence (${binaryString}) to DECIMAL (${decimal}).`);
Isaac
fonte
0
// binary to decimal
function bin2dec(binary) {
    let decimal = 0
    let base = 1
    let index = binary.length-1
    
    while (index >= 0) {
        decimal += (binary[index] % 2) * base
        base = base * 2
        index--
    }
    return decimal
}
// decimal to binary
function dec2bin(decimal){
    let binary = (decimal >>> 0).toString(2)
    return binary
}
Sodium United
fonte