2010-05-10 67 views
78

Tôi biết rằng 0x là tiền tố cho số thập lục phân trong Javascript. Ví dụ: 0xFF là viết tắt của số 255.Có "0b" hoặc thứ gì đó tương tự như đại diện cho số nhị phân trong Javascript

Có điều gì đó tương tự cho số nhị phân không? Tôi mong đợi 0b1111 để đại diện cho số 15, nhưng điều này không hiệu quả đối với tôi.

+1

Ra khỏi tò mò: Tại sao bạn sẽ 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 mức thấp đòi hỏi các chữ nhị phân. –

+12

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. –

+4

sử dụng nút js cho robot là một ví dụ điển hình về nơi nhị phân có thể được yêu cầu –

Trả lời

107

Cập nhật:

Mới hơn các phiên bản của JavaScript - đặc biệt là ECMAScript 6 - đã thêm hỗ trợ cho nhị phân (prefix 0b) và bát phân (prefix 0o) literals số:

var foo = 0b1111; // foo will be set to 15 
var bar = 0o17;  // bar will be set to 15 

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 là khi Spartan đến.

(Nhờ bình luận Semicolon 's và urish's answer cho trỏ này ra.)

gốc trả lời:

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

Một thay thế có thể là phải vượt qua một chuỗi nhị phân với phương pháp parseInt cùng với radix:

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

@MishaMoroshko Tôi đồng ý, nhưng ít ngôn ngữ có hỗ trợ '0b'. –

+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 (tất cả?) Đều hỗ trợ JavaScript. Nó không được phép trong chế độ nghiêm ngặt. – Deebster

+5

Lưu ý rằng nội bộ trong JavaScript, mỗi số là một float 64bit, không có thứ gì như 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

18

Nếu mối quan tâm chính của bạn là màn hình chứ không phải mã hóa, có một built-in hệ thống chuyển đổi 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" 

Ref: JavaScript Number Reference

5

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

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

Dễ thương, nếu có chút lạ. Nhưng đó là JavaScript cho bạn. 'bin' được gán một số có dạng nhị phân, nhưng thực sự được phân tích cú pháp cơ sở 10. Hàm' parseInt' mong đợi một chuỗi là arg đầu tiên, vì vậy nó biến nó thành "1111" (biểu diễn cơ số 10), sau đó tái phân tích nó như thể nó là cơ sở 2. –

9

Theo như tôi biết không thể sử dụng biểu thức 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 thay thế 3 là hầu hết "đẹp trai" cho dễ đọ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ợ giá trị lên đến 255.

Alternative 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"; } 

Alternative 3: b00001111

Phiên bản này cho phép bạn nhập số nhị phân 8 chữ số b00000000, 4 chữ số b0000 và variab le digits b0. Đó là b01 là bất hợp pháp, bạn phải sử dụng b0001 hoặ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; 
+0

# 3 khá thông minh! – bishop

18

Tôi biết rằng 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 tốt, nhưng được kịch bản của bạn ...

tôi làm điều đó 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 
+0

Điều này thật tuyệt! 8-) Lưu ý rằng 'ParseInt (" 101 ", 2)' có thể là câu trả lời thực tế! –

1

Chuyển đổi chuỗi nhị phân để số và visa-versa.

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

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

Tìm kiếm BinaryIntegerLiteral trong ES6 Spec Draft.

1

Không, nhưng bạn có thể sử dụng parseInt và tùy chọn bỏ qua các dấu ngoặc kép.

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

Những bất lợi duy nhất của bỏ qua các dấu ngoặc kép là, đối 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 
+0

Điểm rất tốt ở đây !!! – Jankapunkt

-2
// 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; } 
} 
+0

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

0

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

Từ cách nói chữ Q, có vẻ như bạn chỉ đang nói về việc sử dụng các chữ cái nhị phân trong mã của bạn 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ì vậy 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 xảy ra lỗi hơn.

Chỉ cần xem xét khả năng đọc, Thử so sánh mà trong số đó là lớn hơn:
10001000000010010 hoặc 1001000000010010

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

Các vấn đề liên quan