【问题标题】:Performing bitwise operations on large values对大值执行按位运算
【发布时间】:2014-10-17 17:48:16
【问题描述】:

我想对一些较大的值进行按位运算:

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

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

【问题讨论】:

  • 即使你的36028797018963968 也没有真正工作,如果你执行console.log(36028797018963968),也不会显示出来,因为它高于js的int限制。根据您需要的操作,需要使用字符串或大型 int 库进行管理

标签: javascript


【解决方案1】:

在 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"

【讨论】:

    【解决方案2】:

    谢谢@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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-12-23
      • 1970-01-01
      • 2010-12-15
      • 1970-01-01
      • 2011-10-16
      • 1970-01-01
      • 2014-02-06
      相关资源
      最近更新 更多