我在javascript中有两个我想要的数字。它们都是33位长
在C#中:
((4294967296 & 4294967296 )==0) is false
但是在javascript:
((4294967296 & 4294967296 )==0) is true
4294967296是((长)1)<< 32
据我了解,这是因为javascript在执行按位操作时会将值转换为int32。
我该如何解决这个问题? 有关如何替换位和一组其他数学运算以使位不丢失的任何建议吗?
答案 0 :(得分: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;
}
假设系统正确处理至少30位按位操作。
答案 1 :(得分: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));
答案 2 :(得分:2)
Javascript中有几个BigInteger librairy,但它们都没有提供您目前所需的按位操作。如果您有动力并且确实需要该功能,您可以修改其中一个librairy并添加一个方法来执行此操作。他们已经提供了一个很好的代码库来处理大量的数据。
您可以在此问题中找到Javascript中的BigInteger图书馆列表:
答案 3 :(得分:1)
最简单的逐位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)
}