我想用一些大值执行按位运算:
var someVariable = 4;
someVariable |= 36028797018963968; // add flag, 1 << 55
但是,结果始终是4
而不是36028797018963972
。经过一些研究,我遇到了this answer,它说Javascript在进行按位操作时将数字转换为32位表示,这解释了为什么我可能遇到这个问题,但我该如何解决呢?经过一些更多的研究,我遇到了一些Javascript bigint库,但如果可能的话,我想在没有库的情况下这样做。如何在Javascript中对大数字执行按位运算?
答案 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