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