bagaimana cara mengubah string biner menjadi desimal?

100

Saya ingin mengubah string biner menjadi digit misalnya

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

Bagaimana itu mungkin? Terima kasih


sumber

Jawaban:

197

The parseIntfungsi mengkonversi string untuk nomor, dan dibutuhkan argumen kedua menentukan dasar di mana representasi string adalah:

var digit = parseInt(binary, 2);

Lihat aksinya .

Jon
sumber
1
Apakah ini masih relevan? parseInt(101, 2)kembali 5.
srph
13
@srph: Itu tidak mengherankan, 101 di basis 2 adalah 5 di basis 10.
Jon
3
Ah, begitu. Saya pasti salah paham apa itu parseInt. Saya pikir itu akan mengubah string dari basis 10 -> apa pun (berpikir seperti parseInt('5612', 2)akan mengembalikan bentuk binernya;).
srph
21

ES6 mendukung literal numerik biner untuk bilangan bulat, jadi jika string biner tidak dapat diubah, seperti dalam kode contoh dalam pertanyaan, seseorang dapat mengetiknya sebagaimana adanya dengan awalan 0batau 0B:

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

parseInt() dengan radix adalah solusi terbaik (seperti yang dikatakan oleh banyak orang):

Tetapi jika Anda ingin mengimplementasikannya tanpa parseInt, berikut adalah implementasinya:

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

Gunakan parameter radixparseInt :

var binary = "1101000";
var digit = parseInt(binary, 2);
console.log(digit);
phihag
sumber
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
sumber
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
sumber
2

Saya mengumpulkan semua yang disarankan orang lain dan membuat fungsi berikut yang memiliki 3 argumen, bilangan dan basis dari mana nomor itu berasal dan basis tempat nomor itu akan berada:

changeBase(1101000, 2, 10) => 104

Jalankan Cuplikan Kode untuk mencobanya sendiri:

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>

FYI: Jika Anda ingin memberikan 2d sebagai nomor hex, Anda harus mengirimkannya sebagai string sehingga bunyinya seperti ini: changeBase('2d', 16, 10)

Muhammad Musavi
sumber
Tidak menangani angka floating point. 3.14159265,10,16 memberikan 3
Mark Manning
1

Implementasi lain hanya untuk latihan JS fungsional bisa jadi

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
di mana +cmemaksa Stringtipe cke Numbernilai tipe untuk penambahan yang tepat.

Redu
sumber
0

Algoritme konversi biner konvensional yang sedikit dimodifikasi menggunakan sintaks ES6 dan fitur otomatis lainnya:

  1. Ubah string urutan biner menjadi Array (dengan asumsi itu belum diteruskan sebagai array)

  2. Urutan terbalik untuk memaksa indeks 0 dimulai dari digit biner paling kanan karena biner dihitung dari kanan-kiri

  3. 'Mengurangi' Fungsi array melintasi array, melakukan penjumlahan (2 ^ indeks) per digit biner [hanya jika digit biner === 1] (0 digit selalu menghasilkan 0)

CATATAN: Rumus konversi biner:

{di mana d = digit biner, i = indeks array, n = panjang array-1 (dimulai dari kanan)}

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
sumber