Có có 0bb hay một cái gì đó tương tự để thể hiện một số nhị phân trong Javascript


130

Tôi biết đó 0xlà tiền tố cho các số thập lục phân trong Javascript. Ví dụ: 0xFFviết tắt của số 255.

Có một cái gì đó tương tự cho số nhị phân? Tôi hy vọng 0b1111sẽ đại diện cho số 15, nhưng điều này không làm việc cho tôi.


1
Vì tò mò: Tại sao bạn cần chữ nhị phân trong Javascript? Bản chất cấp cao của Javascript có nghĩa là nó thường không cần phải tương tác với các cấu trúc cấp thấp sẽ yêu cầu chữ nhị phân.
Joachim Sauer

19
Bởi vì cách này mã sẽ dễ đọc hơn. Việc triển khai của tôi dựa trên một số Đặc điểm kỹ thuật sử dụng số nhị phân.
Misha Moroshko

5
sử dụng nút js cho robot là một ví dụ điển hình về việc có thể yêu cầu nhị phân
Greg Woods

Bạn có thể xem xét sử dụng dấu tách số để dễ đọc hơn. 0b0111_0_1_0_1.
Toàn cảnh

Câu trả lời:


181

Cập nhật:

Các phiên bản mới hơn của JavaScript - cụ thể là ECMAScript 6 - đã thêm hỗ trợ cho nhị phân (tiền tố 0b), bát phân (tiền tố 0o) và thập lục phân (tiền tố 0x:) chữ số:

var bin = 0b1111;    // bin will be set to 15
var oct = 0o17;      // oct will be set to 15
var oxx = 017;       // oxx will be set to 15
var hex = 0xF;       // hex will be set to 15
// note: bB oO xX are all valid

Tính năng này đã có sẵn trong Firefox và Chrome. Nó hiện không được hỗ trợ trong IE, nhưng rõ ràng sẽ là khi Spartan đến.

(Cảm ơn bình luận của Semicoloncâu trả lời của Urish vì đã chỉ ra điều này.)

Câu trả lời gốc:

Không, không có số tương đương cho số nhị phân. JavaScript chỉ hỗ trợ các chữ số ở dạng thập phân (không có tiền tố), thập lục phân (tiền tố 0x) và bát phân (tiền tố0 ).

Một cách khác có thể là truyền một chuỗi nhị phân cho parseIntphương thức cùng với cơ số:

var foo = parseInt('1111', 2);    // foo will be set to 15

2
@MishaMoroshko Tôi đồng ý, nhưng ít ngôn ngữ có 0bhỗ trợ.
Alba Mendez

5
Về mặt kỹ thuật, JavaScript không có ký hiệu bát phân, mặc dù hầu hết các trình duyệt (tất cả?) Đều hỗ trợ nó. Nó rõ ràng không được phép trong chế độ nghiêm ngặt.
Deebster

5
Lưu ý rằng bên trong JavaScript, mỗi số là số float 64 bit, không có thứ gọi là số nguyên. Do đó với số lượng lớn, bạn mất độ chính xác. "Số nguyên" chính xác lớn nhất là 2 ^ 53 hoặc 9007199254740992.
zupa

5
Có số nguyên, vì số nguyên là một thuật ngữ toán học, không có là int typekhông integer type, vì vậy tất cả các số nguyên được lưu trữ như nổi.
Perkins

3
Câu trả lời này là đúng vào thời điểm đó, nhưng nó có thể sử dụng một bản cập nhật. Như Urish chỉ ra trong câu trả lời của mình dưới đây, nghĩa đen cho số nhị phân và số bát phân (bát phân hiện được viết "0o1") nằm trong ES6. Họ đã cập nhật Firefox, Chrome và thậm chí là bản xem trước của IE mới (Spartan).
Dấu chấm phẩy

29

Trong ECMASCript 6, điều này sẽ được hỗ trợ như một phần của ngôn ngữ, nghĩa 0b1111 === 15là đúng. Bạn cũng có thể sử dụng chữ hoa B (ví dụ 0B1111).

Tìm kiếm NumericLiteralstrong ES6 Spec .


23

Tôi biết rằng mọi người nói rằng việc mở rộng các nguyên mẫu không phải là một ý tưởng hay, nhưng là kịch bản của bạn ...

Tôi làm theo cách này:

Object.defineProperty(Number.prototype, 'b', {set:function(){return false;},get:function(){return parseInt(this, 2);}});

100..b       // returns 4
11111111..b  // returns 511
10..b+1      // returns 3

// and so on

3
Thật tuyệt! 8-) Lưu ý rằng đó ParseInt("101", 2)có thể là câu trả lời thực tế!
Alexis Wilke

20

Nếu mối quan tâm chính của bạn là hiển thị thay vì mã hóa, thì có một hệ thống chuyển đổi tích hợp mà bạn có thể sử dụng:

var num = 255;
document.writeln(num.toString(16)); // Outputs: "ff"
document.writeln(num.toString(8)); // Outputs: "377"
document.writeln(num.toString(2)); // Outputs: "11111111"

Tham chiếu: Tham chiếu số JavaScript


11

Theo như tôi biết thì không thể sử dụng bộ khử nhị phân trong Javascript. Tôi có ba giải pháp cho bạn, tất cả đều có vấn đề của họ. Tôi nghĩ rằng phương án 3 là "dễ nhìn" nhất về khả năng đọc và nó có thể nhanh hơn nhiều so với phần còn lại - ngoại trừ chi phí thời gian chạy ban đầu. Vấn đề là nó chỉ hỗ trợ các giá trị lên tới 255.

Phương án 1: "00001111".b()

String.prototype.b = function() { return parseInt(this,2); }

Phương án 2: b("00001111")

function b(i) { if(typeof i=='string') return parseInt(i,2); throw "Expects string"; }

Phương án 3: b00001111

Phiên bản này cho phép bạn nhập nhị phân 8 chữ số b00000000, 4 chữ số b0000và chữ số biến b0. Đó là b01bất hợp pháp, bạn phải sử dụng b0001hoặc b1.

String.prototype.lpad = function(padString, length) {
    var str = this;
    while (str.length < length)
        str = padString + str;
    return str;
}
for(var i = 0; i < 256; i++)
    window['b' + i.toString(2)] = window['b' + i.toString(2).lpad('0', 8)] = window['b' + i.toString(2).lpad('0', 4)] = i;

6

Có thể điều này sẽ hữu ích:

var bin = 1111;
var dec = parseInt(bin, 2);
// 15

10
Dễ thương, nếu hơi lạ. Nhưng đó là JavaScript dành cho bạn. binđược gán một số trông giống như ở dạng nhị phân, nhưng thực sự đang được phân tích cú pháp cơ sở 10. parseIntHàm dự kiến ​​một chuỗi là đối số đầu tiên, vì vậy nó biến nó thành "1111" (đại diện cơ sở 10), sau đó phân tích lại nó như thể đó là căn cứ 2.
Ted Hopp

2

Không, nhưng bạn có thể sử dụng parseInt và tùy ý bỏ qua các trích dẫn.

parseInt(110, 2); // this is 6 
parseInt("110", 2); // this is also 6

Nhược điểm duy nhất của việc bỏ qua các trích dẫn là, với số lượng rất lớn, bạn sẽ tràn nhanh hơn:

parseInt(10000000000000000000000, 2); // this gives 1
parseInt("10000000000000000000000", 2); // this gives 4194304

1

Chuyển đổi chuỗi nhị phân thành số và ngược lại.

var b = function(n) {
    if(typeof n === 'string')
        return parseInt(n, 2);
    else if (typeof n === 'number')
        return n.toString(2);
    throw "unknown input";
};

-1

Tôi biết điều này không thực sự trả lời câu hỏi Q (đã được trả lời nhiều lần), tuy nhiên tôi đề nghị bạn (hoặc những người khác quan tâm đến chủ đề này) xem xét thực tế rằng tương thích trình duyệt dễ đọc nhất và ngược / tương lai / tương thích cách sẽ chỉ là sử dụng các đại diện hex.

Từ cụm từ của Q, có vẻ như bạn chỉ nói về việc sử dụng các chữ nhị phân trong mã của mình và không xử lý các biểu diễn nhị phân của các giá trị số (mà parstInt là cách để đi).

Tôi nghi ngờ rằng có nhiều lập trình viên cần xử lý các số nhị phân không quen thuộc với ánh xạ từ 0-F đến 0000-1111. về cơ bản tạo nhóm bốn và sử dụng ký hiệu hex.

vì vậy thay vì viết 101000000010, bạn sẽ sử dụng 0xA02 có cùng ý nghĩa và dễ đọc hơn và ít có khả năng gặp lỗi hơn.

Chỉ cần xem xét khả năng đọc, Hãy thử so sánh cái nào lớn hơn:
10001000000010010 hoặc 1001000000010010

và nếu tôi viết chúng như thế này:
0x11012 hoặc 0x9012


-3
// Conversion function
function bin(nb)
{
    return parseInt(nb.toString(2));
}

// Test
var stop = false;
while(!stop)
{
    var n = parseInt(prompt("Type a decimal number : "));
    alert(bin(n));

    var str = prompt("Retry ? Y / N");
    if(str === "N") { stop = true; }
}

parseInt (không có tham số thứ hai) chuyển đổi chuỗi nhị phân trở lại số 10 cơ sở! ví dụ 0b100 (4) trở thành 100 và sau đó được cảnh báo quay lại chuỗi!
Tom
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.