【问题标题】:javascript bitwise 64 bit implementationjavascript按位64位实现
【发布时间】:2016-10-20 05:38:12
【问题描述】:

在 javascript 中,我们无法在按位运算中计算大于 32 位的值。但是在 c# 中我们可以做到这一点。

这里是例子如果我们尝试运行下面的一个浏览器控制台

4294967296 & 8589934591

它返回 0 但在 C# 中它返回 4294967296

我搜索了一下,发现我们可以使用goog.math.Long 来实现大于 32 位的实现。

但我的问题是,我找不到在客户端实现逻辑的示例。

谁能帮帮我。

提前致谢

【问题讨论】:

  • 您链接到的文档清楚地提到了and 方法。尝试后会发生什么?
  • 你是指view source吗? ln。 130-139 和 ln。 51-63
  • 添加JS文件后,我得到goog is undefined
  • @shankar.siva 请记住:您需要在使用之前包含您使用的任何库。你是如何包含它的?
  • 我找不到需要包含的库。

标签: javascript integer 64-bit bit-manipulation


【解决方案1】:

我从这个 URL 获得了线索,但没有使用 goog.math.Long。

How to do bitwise AND in javascript on variables that are longer than 32 bit?

这是一个用于任意大整数的有趣函数:

function BitwiseAndLarge(val1, val2) {
    var shift = 0, result = 0;
    var mask = ~((~0) << 30); // Gives us a bit mask like 01111..1 (30 ones)
    var divisor = 1 << 30; // To work with the bit mask, we need to clear bits at a time
    while( (val1 != 0) && (val2 != 0) ) {
        var rs = (mask & val1) & (mask & val2);
        val1 = Math.floor(val1 / divisor); // val1 >>> 30
        val2 = Math.floor(val2 / divisor); // val2 >>> 30
        for(var i = shift++; i--;) {
            rs *= divisor; // rs << 30
        }
        result += rs;
    }
    return result;
}

假设系统正确处理至少 30 位的按位运算。

【讨论】:

    【解决方案2】:

    使用 goog.math.Long 实现 JavaScript 按位 64 位

    示例如下:

    <!DOCTYPE html>
    <html lang="en" xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta charset="utf-8" />
        <title>Bitmask 64 Bit</title>
        <script type="text/javascript" src="goog.math.long.js"></script>
        <script type="text/javascript">
            var val1 = goog.math.Long.fromString("4611686018427387904"); // 2^62
            var val2 = goog.math.Long.fromString("6917529027641081856"); // 2^61 | 2^62
            var val3 = goog.math.Long.fromString("2305843009213693952"); // 2^61
            var val4 = goog.math.Long.fromString("4611686018427387904"); // 2^62
            document.writeln(val1.and(val2)); // 2^62 & (2^61 | 2^62)  
            document.writeln(val3.or(val4));  // 2^61 | 2^62
        </script>
    </head>
    <body>
    </body>
    </html>
    

    使用此库需要许可证。

    【讨论】:

      【解决方案3】:

      我认为你真的不需要 goog.math.long 吗? 将其转换为字符串,进行拆分就足够了。然后进行AND操作并重构:

      var a = 8589934592;
      var str = a.toString()
      var subNumber1 = parseInt(str.slice(0, str.length - 5));
      var subNumber2 = parseInt(str.slice(str.length - 5));
      var res1 = (subNumber1 & subNumber1).toString();
      var res2 = (subNumber2 & subNumber2).toString();
      var res = parseInt(res1.concat(res2));
      console.log(res);
      

      【讨论】:

      • 为什么是正确的? (实际上,正确吗?)AFAIK没有简单的方法可以将按位运算与十进制数字相关联。
      • 我的意思是它现在可以工作了,但那是因为x &amp; x == x 总是正确的,不管x 有多有意义。但是,如果您有 ab,那么这将无法正常工作。
      • 您对这个问题有一点误解。现在我更新了不同的例子。你能检查一下吗?
      【解决方案4】:

      我不确定这是否是您要查找的内容,但如果您将 google/closure-library 与 npm 一起使用。您可以使用BrowserifyWebpack 将模块捆绑到客户端。

      【讨论】:

        猜你喜欢
        • 2014-09-03
        • 1970-01-01
        • 2015-09-28
        • 1970-01-01
        • 2012-07-25
        • 2019-03-25
        • 1970-01-01
        • 1970-01-01
        • 2015-01-25
        相关资源
        最近更新 更多