JavaScript:长-长数字的按位移位
我需要在JavaScript中将一个值按位移位64次。但是JavaScript在JavaScript:长-长数字的按位移位,javascript,Javascript,我需要在JavaScript中将一个值按位移位64次。但是JavaScript在32之后开始取整 例如: for(var j = 0; j < 64; j++) { mask = mask << 1; console.log(mask); } for(var j=0;j
32之后开始取整
例如:
for(var j = 0; j < 64; j++)
{
mask = mask << 1;
console.log(mask);
}
for(var j=0;j<64;j++)
{
mask=maskJavaScript最初将其所有数字存储为64位,但一旦开始使用位运算符,解释器就会将数字转换为32位表示
在JS中,位运算符有点粗糙,所以令人烦恼的是,您可能需要做一些更聪明的事情,比如编写自己的64位函数。"在Java中,按位运算符处理整数。JavaScript没有整数。它只有双精度浮点数。因此,按位运算符将其数字操作数转换为整数,进行运算,然后再转换回整数。在大多数语言中,这些运算符非常接近硬件,速度非常快。在JavaScrip中t、 它们离硬件很远,速度也很慢。JavaScript很少用于进行位操作。“-Douglas Crockford
关键是你没有任何理由使用位运算符,只需乘以或除以2^numbits即可
您的代码应该是:
for(var j = 0; j < 64; j++) {
mask = mask * 2;
console.log(mask);
}
你明白了。Javascript在语言中没有整数作为可见类型;所有数字都是双精度(64位)浮点运算。这些运算最多只能容纳53位尾数,而64位整数不能容纳其中。因此,当它对整数进行内部转换并返回时,它只使用32位。注意:上面的代码可以工作,但最多只能容纳52位尾数,而不是64位!如果您设置mask=1,然后运行上面的代码,它将以184467440737095520结尾00-但2^64实际上是18446744073709551616。最后4位被屏蔽,因为52位不能容纳64位:-(
function lshift(num, bits) {
return num * Math.pow(2,bits);
}