如何在长度超过32位的变量的javascript中进行按位和?

Ole*_* D. 23 javascript 64-bit bit-manipulation

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

在C#中:

 ((4294967296 & 4294967296 )==0) is false
Run Code Online (Sandbox Code Playgroud)

但在javascript中:

 ((4294967296 & 4294967296 )==0) is true
Run Code Online (Sandbox Code Playgroud)

4294967296是((长)1)<< 32

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

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

pal*_*wim 13

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

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;
}
Run Code Online (Sandbox Code Playgroud)

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

  • 我欠你一杯啤酒. (2认同)

Jer*_*ome 6

您可以将每个变量分成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));
Run Code Online (Sandbox Code Playgroud)