如何在javascript中对长度大于32位的variables进行按位与?

我有2个数字在JavaScript,我想要和位。 他们都是33bit长

在C#中:

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

但在JavaScript中:

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

4294967296是((long)1)<< 32

据我了解,这是由于JavaScript执行位操作时将值转换为int32的事实。

我如何解决这个问题? 有关如何replace位和一系列其他math运算的build议,使位不丢失?

您可以将每个variables分成2个32位值(如高位字和低位字),然后对两个位进行按位操作。

下面的脚本以Windows .js脚本运行。 您可以将WScript.Echo()replace为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)); 

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

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

假定系统正确处理至less30位的位操作。

在Javascript中有几个BigInteger图书馆,但他们都没有提供你需要的按位操作。 如果你有动力,真的需要这个function,你可以修改其中一个库,并添加一个方法。 他们已经提供了一个很好的代码库来处理大量的数据。

你可以在这个问题的JavaScript中findBigInteger librairy的列表:

巨大的整数JavaScript库

Interesting Posts