как преобразовать двоичную строку в десятичную?

100

Я хочу преобразовать двоичную строку в цифру, например

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

Как это возможно? Благодарность


источник

Ответы:

196

parseIntФункция преобразует строки в число, и он принимает второй аргумент , определяющий базу , в которой строковые представления:

var digit = parseInt(binary, 2);

Посмотрите это в действии .

Джон
источник
1
Это все еще актуально? parseInt(101, 2)возвращается 5.
srph
13
@srph: Это не удивительно, 101 в базе 2 равно 5 в базе 10.
Джон
3
Ах я вижу. Я, должно быть, неправильно понял, что за parseInt. Я думал, что он преобразует строку из базы 10 -> что угодно (думая, parseInt('5612', 2)что вернет ее двоичную форму;).
srph
21

ES6 поддерживает двоичные числовые литералы для целых чисел, поэтому, если двоичная строка неизменяема, как в примере кода в вопросе, можно просто ввести ее так, как она есть, с префиксом 0bили 0B:

var binary = 0b1101000; // code for 104
console.log(binary); // prints 104
GOTO 0
источник
12

parseInt() с Radix - лучшее решение (как говорили многие):

Но если вы хотите реализовать его без parseInt, вот реализация:

  function bin2dec(num){
    return num.split('').reverse().reduce(function(x, y, i){
      return (y === '1') ? x + Math.pow(2, i) : x;
    }, 0);
  }
Сальвадор Дали
источник
11

Используйте параметр radixparseInt :

var binary = "1101000";
var digit = parseInt(binary, 2);
console.log(digit);
Phihag
источник
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);
}
Ильян Шалварков
источник
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
источник
2

Я собрал все, что предлагали другие, и создал следующую функцию, которая имеет 3 аргумента, число и базу, из которой это число произошло, и базу, на которой это число будет:

changeBase(1101000, 2, 10) => 104

Запустите Code Snippet, чтобы попробовать сами:

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>

К вашему сведению: если вы хотите передать 2d как шестнадцатеричное число, вам нужно отправить его в виде строки, чтобы она выглядела так: changeBase('2d', 16, 10)

Мухаммад Мусави
источник
Не обрабатывает числа с плавающей запятой. 3.14159265, 10,16 дает 3
Марк Мэннинг
1

Другая реализация только для отработки функционального JS может быть

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
где +cпринуждает Stringтипа cк Numberзначению типа для правильного сложения.

Уменьшить
источник
0

Слегка модифицированный алгоритм обычного двоичного преобразования с использованием синтаксиса ES6 и дополнительных функций:

  1. Преобразовать строку двоичной последовательности в массив (при условии, что она еще не была передана как массив)

  2. Обратная последовательность, чтобы заставить индекс 0 начинаться с самого правого двоичного разряда, поскольку двоичный код вычисляется справа-слева

  3. 'reduce' Функция массива просматривает массив, выполняя суммирование (2 ^ index) для каждой двоичной цифры [только если двоичная цифра === 1] (цифра 0 всегда дает 0)

ПРИМЕЧАНИЕ: Формула двоичного преобразования:

{где d = двоичная цифра, i = индекс массива, n = длина массива-1 (начиная справа)}

п
∑ (д * 2 ^ я)
я = 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}).`);
Исаак
источник