JavaScript:长整数的按位移位

时间:2008-12-03 14:47:33

标签: javascript

我需要在JavaScript中按位移位值64次。但JavaScript在32之后开始四舍五入。

例如:

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

这会打印从01073741824的值,但随后会轮次并开始打印0

2 个答案:

答案 0 :(得分:31)

“在Java中,按位运算符使用整数.JavaScript没有整数。它只有双精度浮点数。因此,按位运算符将它们的数字操作数转换为整数,执行它们的业务,然后转换在大多数语言中,这些运算符非常接近硬件并且速度非常快。在JavaScript中,它们离硬件非常远,而且非常慢.JavaScript很少用于进行位操作。“ - Douglas Crockford,Javascript: The Good Parts

关键是你没有任何理由使用按位运算符。只需乘以或除以2 ^ numbits。

您的代码应为:

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

或者通常:

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

你明白了。

答案 1 :(得分:8)

JavaScript将其所有数字初始存储为64位,但只要您开始使用按位运算符,解释器就会将数字转换为32位表示。

按位运算符在JS中有点笨拙,所以很烦人,你可能需要做一些更聪明的事情,比如编写你自己的64位函数。