バイナリ文字列を10進数に変換する方法は?


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関数は文字列を数値に変換し、文字列表現の基数を指定する2番目の引数を取ります。

var digit = parseInt(binary, 2);

実際の動作をご覧ください


1
これはまだ関係がありますか?parseInt(101, 2)を返します5
srph 2015年

13
@srph:驚くことではありません、ベース2における101がベース10に5
ジョン

3
ああ、分かった。私は何を誤解したに違いありませんparseInt。文字列を基数10から変換すると思いました->何でも(のように考えるとparseInt('5612', 2)、バイナリ形式が返されます;)。
srph 2015年

21

ES6は整数の2進数リテラルをサポートしているため、質問のサンプルコードのように、2進数文字列が不変である場合は、接頭辞0bまたは0B:を付けてそのまま入力できます。

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

12

parseInt() 基数を使用するのが最善の解決策です(多くの人が言ったように):

しかし、parseIntなしで実装したい場合は、次の実装があります。

  function bin2dec(num){
    return num.split('').reverse().reduce(function(x, y, i){
      return (y === '1') ? x + Math.pow(2, i) : x;
    }, 0);
  }


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

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を16進数として渡したい場合は、次のように文字列として送信する必要があります。 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強制変換します。StringcNumber


0

ES6構文と自動機能をさらに利用した従来のバイナリ変換アルゴリズムを少し変更しました。

  1. バイナリシーケンス文字列を配列に変換します(まだ配列として渡されていないと仮定します)

  2. バイナリが右左に計算されるときに、0インデックスを右端の2進数から開始するように強制する逆シーケンス

  3. 'reduce'配列関数は配列をトラバースし、2進数ごとに(2 ^ index)の合計を実行します[2進数=== 1の場合のみ](0桁は常に0になります)

注:バイナリ変換式:

{ここで、d = 2進数、i =配列インデックス、n =配列の長さ-1(右から開始)}

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}).`);
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.