为什么这个按位操作在Javascript中失败了

时间:2014-02-13 07:19:44

标签: javascript

有些人请在javascript中进行按位操作时对此有所了解:

65527|34359738368 =>65527

是否可以在javascript中处理此问题?

从mysql命令行:

select 65527|34359738368 ;
+-------------------+
| 65527|34359738368 |
+-------------------+
|       34359803895 |
+-------------------+

更重要的是它不到2 ^ 36

select (65527|34359738368)< pow(2,36);
+--------------------------------+
| (65527|34359738368)< pow(2,36) |
+--------------------------------+
|                              1 |
+--------------------------------+

我从这个SO Q读到的是javascript中的int支持max 2^53值。我可能会失踪......

3 个答案:

答案 0 :(得分:3)

你自己联系了答案:

  

请注意,按位运算符和移位运算符以32位整数运行。

答案 1 :(得分:2)

正如Tim已经指出的那样,JavaScript中的按位操作使用32位数字。一个解决方案(可能是最简单的)是使用支持按位操作的bignum库,例如:https://www.npmjs.org/package/bignum

另一种方法是将数字分解为单词,并分别对单词进行操作,老派风格:

var a = 65527;
var b = 34359738368;
var wordSize = 4294967296;  // 2^32
var ah = Math.floor(a/wordSize);
var al = a - ah*wordSize;
var bh = Math.floor(b/wordSize);
var bl = b - bh*wordSize;

var xh = ah | bh;
var xl = al | bl;
var x = xh*wordSize + xl;

我们所做的就是将两个操作数分成两个单词(高位和低位),对单词进行操作,将结果(x)作为高位和低位词,然后将它们重新组合成一个单词

当然,您可以将其捆绑成一个简洁的功能:

function or64(a,b){
    var w64 = 18446744073709552000;  // 2^64
    var w32 = 4294967296;            // 2^32
    if(a>w64 || b>w64)
        throw new Error('operands cannot exceed 64 bits');
    var ah = Math.floor(a/w32);
    var al = a - ah*w32;
    var bh = Math.floor(b/w32);
    var bl = b - bh*w32;
    return (ah|bh)*w32 + (al|bl);
}

答案 2 :(得分:0)

现在(2020年),您还可以使用 BigInt ,因为ES2020是标准的内置对象。 BigInt可用于任意大的整数。

在JavaScript中将标准数字转换为BigInt的最简单方法是在其后附加“ n”。像这样:

65527n|34359738368n => 34359803895n

有关更多信息,请参见https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/BigInt

相关问题