JavaScript:长整数的按位移位

san*_*ndi 17 javascript

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

例如:

for(var j = 0; j < 64; j++)
{
    mask = mask << 1;
    console.log(mask);
}
Run Code Online (Sandbox Code Playgroud)

这将从打印0到打印,1073741824然后打印并开始打印0.

its*_*dok 32

"在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);
}
Run Code Online (Sandbox Code Playgroud)

或者一般:

function lshift(num, bits) {
    return num * Math.pow(2,bits);
}
Run Code Online (Sandbox Code Playgroud)

你明白了.

  • 注意:上面的代码可以工作,但只能达到 52 位尾数 - 而不是 64 位!如果设置mask=1;然后运行上面的代码,它以 18446744073709552000 结尾 - 但 2^64 实际上是 18446744073709551616。最后 4 位数字被空白,因为 52 位不能容纳 64 位:-( (4认同)

ada*_*dam 9

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

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

  • JS数字的尾数为53位,而不是64位. (4认同)
  • Javascript没有整数作为语言中的可见类型; 所有数字都是双精度(64位)浮点数.那些只能容纳53位尾数,64位整数不适合.因此,当它进行内部转换为整数和返回时,它只使用32位. (3认同)

小智 5

对于BigInt,您可以使用按位运算符,但 除外>>>

例如:

console.log(1n << 32n); // 4294967296n
console.log(1n << 40n); // 1099511627776n

console.log((1n << 40n).toString(2)); // 1 00000000 00000000 00000000 00000000 00000000
Run Code Online (Sandbox Code Playgroud)

BigInt 是一个 64 位有符号整数。