【问题标题】:JavaScript: Bitwise shift of long long numberJavaScript:长长数的按位移位
【发布时间】:2010-09-25 03:21:58
【问题描述】:

我需要在 JavaScript 中将一个值按位移动 64 次。但是 JavaScript 在 32 之后开始舍入。

例如:

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

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

【问题讨论】:

    标签: javascript


    【解决方案1】:

    “在Java中,按位运算符处理整数。JavaScript没有整数。它只有双精度浮点数。因此,按位运算符将其数字操作数转换为整数,执行其业务,然后转换“ - 道格拉斯·克罗克福德,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);
    }
    

    你明白了。

    【讨论】:

    • 小心:上面的代码有效,但只能达到 52 位尾数 - 而不是 64 位!如果你设置 mask=1;然后运行上面的代码,它以 18446744073709552000 结尾——但 2^64 实际上是 18446744073709551616。最后 4 位被空白,因为 52 位不能容纳 64 位 :-(
    【解决方案2】:

    JavaScript 最初将其所有数字存储为 64 位,但是一旦您开始使用按位运算符,解释器就会将数字转换为 32 位表示形式。..

    按位运算符在 JS 中有点 hacky,因此很烦人,您可能不得不做一些更聪明的事情,比如编写自己的 64 位函数。

    【讨论】:

    • Javascript 在语言中没有整数作为可见类型;所有数字都是双精度(64 位)浮点数。那些最多只能容纳 53 位尾数,而 64 位整数不适合。所以当它内部转换为整数并返回时,它只使用 32 位。
    猜你喜欢
    • 2019-01-24
    • 1970-01-01
    • 1970-01-01
    • 2023-04-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-21
    • 1970-01-01
    相关资源
    最近更新 更多