如何在 javascript 中对超过 32 位的变量进行按位 AND 运算?

IT技术 javascript 64-bit bit-manipulation
2021-02-25 18:59:39

我在 javascript 中有 2 个数字,我想要位和。它们都是 33 位长

在 C# 中:

 ((4294967296 & 4294967296 )==0) is false

但在 javascript 中:

 ((4294967296 & 4294967296 )==0) is true

4294967296 是 ((long)1) << 32

据我了解,这是因为 javascript 在执行按位操作时将值转换为 int32。

我该如何解决这个问题?关于如何替换位和一组其他数学运算以便位不会丢失的任何建议?

4个回答

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

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 位的按位运算。

谢谢,但该功能不应该像宣传的那样工作吗?哪些操作不起作用(例如val1and的值、val2函数的结果以及您期望从函数中获得的值)?
2021-04-16 18:59:39
惊人的!你有按位或同样的功能吗?
2021-04-20 18:59:39
关闭我的头顶,我想你只想改变单一的&一个|var rs = (mask & val1) & (mask & val2);var rs = (mask & val1) | (mask & val2);
2021-04-28 18:59:39
@palswim,惊人的解决方案
2021-05-01 18:59:39
很棒的功能,但我无法让它在 32 位或更多位上工作。
2021-05-15 18:59:39

您可以将每个变量拆分为 2 个 32 位值(如高位字和低位字),然后对这两对进行按位运算。

下面的脚本作为 Windows .js 脚本运行。您可以将 WScript.Echo() 替换为用于 Web 的 alert()。

var a = 4294967296;
var b = 4294967296;

var w = 4294967296; // 2^32

var aHI = a / w;
var aLO = a % w;
var bHI = b / w;
var bLO = b % w;

WScript.Echo((aHI & bHI) * w + (aLO & bLO));
我在 javascript 中做了一个快速测试,它不适用于 a=114287881752716 b=0x0ffffffffff0000
2021-04-21 18:59:39
紧急通知 - 您必须记住,Javascript 不支持数字中的真正 64 位值,最大 53 位。因为它使用 float64 (double) 来操作任何整数。另见stackoverflow.com/a/45425630/1848217
2021-04-25 18:59:39
你能举一个分裂的例子吗?谢谢!
2021-05-06 18:59:39
对于 -2^32 左右的值(但不完全是 -2^32),这仍然失败。我找不到解决方案。舍入hi零件仅适用于少数值。hi当它应该是 -2 或什么的时候,往往会保持在 -1。
2021-05-09 18:59:39

Javascript 中有几个 BigInteger 库,但它们都没有提供您目前需要的按位运算。如果您有动力并且确实需要该功能,您可以修改其中一个库并添加一个方法来这样做。他们已经提供了一个很好的代码库来处理大量的代码。

您可以在以下问题中找到 Javascript 中 BigInteger 库的列表:

巨大的整数 JavaScript 库

最简单的按位 AND,适用于 JavaScript 的最大数量

由于内部原因,JavaScript 的最大整数值为 2^53(它是一个双浮点数)。如果您需要更多,则有用于大整数处理的好库。

2^53 是 9,007,199,254,740,992,或约 9,000 万亿(约 9 万亿)。

// Works with values up to 2^53
function bitwiseAnd_53bit(value1, value2) {
    const maxInt32Bits = 4294967296; // 2^32

    const value1_highBits = value1 / maxInt32Bits;
    const value1_lowBits = value1 % maxInt32Bits;
    const value2_highBits = value2 / maxInt32Bits;
    const value2_lowBits = value2 % maxInt32Bits;
    return (value1_highBits & value2_highBits) * maxInt32Bits + (value1_lowBits & value2_lowBits)
}
它不适用于:bitwiseAnd_53bit(114287881752716, 0x0fffffffff0000)
2021-05-08 18:59:39