2008-12-03 44 views
13

Tôi cần bitwise thay đổi giá trị 64 lần trong JavaScript. Nhưng JavaScript bắt đầu làm tròn sau 32.JavaScript: Thay đổi bit theo chiều dài số dài

Ví dụ:

for(var j = 0; j < 64; j++) 
{ 
    mask = mask << 1; 
    console.log(mask); 
} 

này in ra giá trị 0-1073741824 nhưng sau đó vòng và bắt đầu in 0.

Trả lời

27

"Trong Java, các toán tử bitwise làm việc với các số nguyên. JavaScript không có số nguyên. Nó chỉ có các số dấu phẩy động chính xác gấp đôi. Do đó, toán tử bit chuyển đổi toán hạng số thành số nguyên, thực hiện công việc kinh doanh của họ chuyển đổi chúng trở lại. Trong hầu hết các ngôn ngữ, các toán tử này rất gần với phần cứng và rất nhanh. Trong JavaScript, chúng rất xa phần cứng và rất chậm. JavaScript hiếm khi được sử dụng để thực hiện thao tác bit. " - Douglas Crockford, Javascript: The Good Parts

Vấn đề là bạn không thực sự có bất kỳ lý do gì để sử dụng toán tử bitwise. Chỉ cần nhân hoặc chia cho 2^numbits.

Mã của bạn nên là:

for(var j = 0; j < 64; j++) { 
mask = mask * 2; 
console.log(mask); 
} 

Hoặc nói chung:

function lshift(num, bits) { 
    return num * Math.pow(2,bits); 
} 

Bạn nhận được các ý tưởng.

+8

jsPerf nói không. http://jsperf.com/multiply-vs-divide/9 – Shinjikun

9

cửa hàng Javascript tất cả các số của nó như là 64 bit initally, nhưng ngay sau khi bạn bắt đầu sử dụng toán tử Bitwise người phiên dịch chuyển số đến một đại diện 32 bit ..

nhà khai thác Bitwise là một chút hacky trong JS và rất khó chịu bạn có thể sẽ phải làm điều gì đó thông minh hơn một chút, như viết các hàm 64 bit của riêng bạn.

+3

Số JS có độ phân giải 53 bit, chứ không phải 64. – lapo

+3

Javascript không có số nguyên làm loại hiển thị trong ngôn ngữ; tất cả các con số là điểm nổi chính xác gấp đôi (64-bit). Chúng chỉ có thể chứa tới 53 bit mantissa, mà một số nguyên 64-bit sẽ không khớp. Vì vậy, khi nó chuyển đổi nội bộ sang số nguyên và ngược lại, nó chỉ sử dụng 32 bit. –

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