我正在寻找一种在 JavaScript 中对 64 位整数执行按位 AND 的方法。
JavaScript 会将其所有 double 值转换为带符号的 32 位整数以执行按位运算 ( details here )。
最佳答案
Javascript 将所有数字表示为 64 位 double precision IEEE 754 floating point numbers (参见 ECMAscript spec,第 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 与对低位和高位 32 位“字”应用 2 个按位 AND 一样简单。
例如:
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
关于javascript - Javascript 中与 64 位整数的按位 AND,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2983206/