JavaScript位64位实现



在JavaScript中,我们无法评估位置操作中的32位。但是在C#中,我们能够做到这一点。

如果我们尝试运行以下一个浏览器控制台

,这是一个示例

4294967296&8589934591

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

我搜索了谷歌,我发现我们能够使用这个Goog.math.math.long实施大于32位位实现。

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

任何人都可以帮助我。

预先感谢

我从此URL中得到了线索,但不使用goog.math.long。

如何在比32位的变量上进行钻头和JavaScript?

这是任意大整数的有趣功能:

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位的位置操作。

JavaScript位64位使用goog.math.long.long

  • 添加JS库http://www.hobsonassoc.com/scripts/cluse/goog/docs/cluse_goog_math_math_long.js.source.html
  • 评论JS库中的// goog.provide('goog.math.Long')
  • 在JS库中添加var goog = {}; goog.math = {};
  • 调用函数var val1 = goog.math.Long.fromString("4611686018427387904");

这是一个示例:

<!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>

使用此库的许可证。

我认为您真的不需要goog.math.long?足以将其转换为字符串,以拆分。然后继续进行操作并重新组合:

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);

我不确定这是否正在寻找,但是如果您使用NPM使用Google/Closure-Library。您可以使用浏览器或WebPack将模块捆绑到客户端。

最新更新