làm thế nào để chuyển đổi chuỗi nhị phân sang thập phân?


100

Tôi muốn chuyển đổi chuỗi nhị phân thành chữ số Ví dụ:

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

Làm thế nào là nó có thể? Cảm ơn

Câu trả lời:


196

Các parseIntchức năng chuyển đổi xâu kí tự sang số, và phải mất một số thứ hai xác định cơ sở, trong đó đại diện chuỗi là:

var digit = parseInt(binary, 2);

Xem nó trong hành động .


1
Điều này vẫn còn phù hợp? parseInt(101, 2)lợi nhuận 5.
srph

13
@srph: Điều đó không có gì đáng ngạc nhiên, 101 ở cơ sở 2 là 5 ở cơ sở 10.
Jon

3
Ah tôi thấy. Tôi phải đã hiểu sai những gì parseInt. Tôi nghĩ rằng nó sẽ chuyển đổi chuỗi từ cơ số 10 -> bất cứ điều gì (suy nghĩ như thế parseInt('5612', 2)sẽ trả về dạng nhị phân của nó;).
srph

21

ES6 hỗ trợ các ký tự số nhị phân cho số nguyên, vì vậy nếu chuỗi nhị phân là không thay đổi, như trong mã ví dụ trong câu hỏi, người ta có thể nhập nó vào như thế với tiền tố 0bhoặc 0B:

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

12

parseInt() với cơ số là một giải pháp tốt nhất (như nhiều người đã nói):

Nhưng nếu bạn muốn triển khai nó mà không cần parseInt, đây là cách triển khai:

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

11

Sử dụng tham số số của parseInt:

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

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

Tôi đã tập hợp tất cả những gì người khác đã đề xuất và tạo ra hàm sau có 3 đối số, số và cơ số mà số đó đến và cơ số mà số đó sẽ là:

changeBase(1101000, 2, 10) => 104

Chạy đoạn mã để tự thử:

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: Nếu bạn muốn chuyển 2d dưới dạng số hex, bạn cần gửi nó dưới dạng một chuỗi để nó diễn ra như sau: changeBase('2d', 16, 10)


Không xử lý số dấu phẩy động. 3,14159265,10,16 cho 3
Mark Manning

1

Một triển khai khác chỉ dành cho thực hành JS chức năng có thể là

var bin2int = s => Array.prototype.reduce.call(s, (p,c) => p*2 + +c)
console.log(bin2int("101010"));
nơi +ccưỡng chế Stringnhập cmột Numbergiá trị kiểu để bổ sung thích hợp.


0

Thuật toán chuyển đổi nhị phân thông thường được sửa đổi một chút bằng cách sử dụng thêm một số cú pháp ES6 và các tính năng tự động:

  1. Chuyển chuỗi chuỗi nhị phân thành Mảng (giả sử nó chưa được chuyển dưới dạng mảng)

  2. Trình tự đảo ngược để buộc chỉ số 0 bắt đầu ở chữ số nhị phân ngoài cùng bên phải vì số nhị phân được tính từ phải sang trái

  3. 'Reduce' Hàm mảng đi qua mảng, thực hiện tính tổng của (2 ^ chỉ số) cho mỗi chữ số nhị phân [chỉ khi chữ số nhị phân === 1] (chữ số 0 luôn mang lại 0)

LƯU Ý: Công thức chuyển đổi nhị phân:

{trong đó d = chữ số nhị phân, i = chỉ số mảng, n = độ dài mảng-1 (bắt đầu từ bên phải)}

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}).`);
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.