对大值执行按位运算

时间:2014-10-17 17:48:17

标签: javascript

我想用一些大值执行按位运算:

var someVariable = 4;
someVariable |= 36028797018963968; // add flag, 1 << 55

但是,结果始终是4而不是36028797018963972。经过一些研究,我遇到了this answer,它说Javascript在进行按位操作时将数字转换为32位表示,这解释了为什么我可能遇到这个问题,但我该如何解决呢?经过一些更多的研究,我遇到了一些Javascript bigint库,但如果可能的话,我想在没有库的情况下这样做。如何在Javascript中对大数字执行按位运算?

2 个答案:

答案 0 :(得分:0)

在chrome中,变量Number.MAX_SAFE_INTEGER包含可用于数学的最大安全数。

在我的chrome中,返回Number.MAX_SAFE_INTEGER = 9007199254740991。 你的号码更大。

试试这个测试:

var a = 36028797018963968;
var b = a+1;
console.log(a==b); // prints true
console.log(a===b); // prints true
console.log(a.toString(2)) // a to binary returns 2^56 which is not a

还有一些信息

var a = Number.MAX_SAFE_INTEGER;
a.toString(2);     // prints  "11111111111111111111111111111111111111111111111111111"
(a+1).toString(2); // prints "100000000000000000000000000000000000000000000000000000" <-- 2^56
(a+2).toString(2); // prints "100000000000000000000000000000000000000000000000000000"

答案 1 :(得分:0)

谢谢@ThanasisGrammatopoulos和@juvian。在研究了很多现有的实现之后,我遇到了一个代表64位二进制补码整数的小宝石,long.js

使用它非常简单:

var a = Long.fromString("36028797018963968", true);
var b = Long.fromString("4", true);
alert('value is ' + a.or(b).toString()); // value is 36028797018963972