在 Javascript 中按位与 64 位整数

新手上路,请多包涵

我正在寻找一种在 JavaScript 中对 64 位整数执行按位与运算的方法。

JavaScript 会将其所有双精度值转换为带符号的 32 位整数以执行按位运算( 此处有详细信息)。

原文由 Toby Hede 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1.3k
2 个回答

Javascript 将所有数字表示为 64 位 双精度 IEEE 754 浮点数(请参阅 ECMAscript 规范,第 8.5 节。)所有高达 2^53 的正整数都可以精确编码。较大的整数会削减其最低有效位。这就留下了一个问题,即如何在 Javascript 中表示 64 位整数——本机数字数据类型显然不能精确地表示 64 位 int。

以下说明了这一点。尽管 javascript 似乎 能够解析表示 64 位数字的十六进制数字,但底层数字表示并不支持 64 位。在浏览器中尝试以下操作:

 <html>
  <head>
    <script language="javascript">
      function showPrecisionLimits() {
        document.getElementById("r50").innerHTML = 0x0004000000000001 - 0x0004000000000000;
        document.getElementById("r51").innerHTML = 0x0008000000000001 - 0x0008000000000000;
        document.getElementById("r52").innerHTML = 0x0010000000000001 - 0x0010000000000000;
        document.getElementById("r53").innerHTML = 0x0020000000000001 - 0x0020000000000000;
        document.getElementById("r54").innerHTML = 0x0040000000000001 - 0x0040000000000000;
      }
    </script>
  </head>
  <body onload="showPrecisionLimits()">
    <p>(2^50+1) - (2^50) = <span id="r50"></span></p>
    <p>(2^51+1) - (2^51) = <span id="r51"></span></p>
    <p>(2^52+1) - (2^52) = <span id="r52"></span></p>
    <p>(2^53+1) - (2^53) = <span id="r53"></span></p>
    <p>(2^54+1) - (2^54) = <span id="r54"></span></p>
  </body>
</html>

在 Firefox、Chrome 和 IE 中,我得到以下信息。如果数字以其完整的 64 位荣耀存储,则所有减法的结果应该为 1。相反,您可以看到 2^53+1 和 2^53 之间的差异是如何丢失的。

 (2^50+1) - (2^50) = 1
(2^51+1) - (2^51) = 1
(2^52+1) - (2^52) = 1
(2^53+1) - (2^53) = 0
(2^54+1) - (2^54) = 0


所以,你可以做什么?

如果您选择将一个 64 位整数表示为两个 32 位数字,那么应用按位 AND 就像将 2 个按位 AND 应用于低位和高位 32 位“字”一样简单。

例如:

 var a = [ 0x0000ffff, 0xffff0000 ];
var b = [ 0x00ffff00, 0x00ffff00 ];
var c = [ a[0] & b[0], a[1] & b[1] ];

document.body.innerHTML = c[0].toString(16) + ":" + c[1].toString(16);

让你:

 ff00:ff0000

原文由 Oren Trutner 发布,翻译遵循 CC BY-SA 3.0 许可协议

这是 AND int64 数字的代码,您可以将 AND 替换为其他按位运算

function and(v1, v2) {
    var hi = 0x80000000;
    var low = 0x7fffffff;
    var hi1 = ~~(v1 / hi);
    var hi2 = ~~(v2 / hi);
    var low1 = v1 & low;
    var low2 = v2 & low;
    var h = hi1 & hi2;
    var l = low1 & low2;
    return h*hi + l;
}

原文由 Andrey 发布,翻译遵循 CC BY-SA 3.0 许可协议

推荐问题