我正在JavaScript中开发一个虚拟机,需要将两个有符号32位数与64位有符号结果相乘,作为两个32位有符号数(高32位和低32位)。32位有符号乘法,JavaScript中有64位结果
我设法为无符号数做相同的两个号码拆分为16位和对这些相乘:a*b = (ah * 2^16 + al) * (bh * 2^16 + bl)
:
function mul_32_unsigned(a, b)
{
var ah = a >>> 16;
var bh = b >>> 16;
var al = a & 0xFFFF;
var bl = b & 0xFFFF;
var mid = ah * bl + al * bh;
var albl = al * bl;
var imm = mid + (albl >>> 16);
var carry = (imm > 0xffffffff) ? 0x10000 : 0;
var lo = ((mid << 16) + albl) >>> 0;
var hi = (ah * bh + (imm >>> 16) + carry) >>> 0;
return [ lo, hi ];
}
不过,我真的不知道该怎么做同样的事情签名的数字。我唯一能想到的是否定任何负数a
或b
以使两者都为正数,执行无符号乘法,然后根据需要否定结果,但这种感觉像是一种无法理解的次优解。任何想法如何做得更好?将a
和b
分成两个有符号的16位数字,每个数字看起来都是合乎逻辑的,但随后我对如何执行其他操作没有任何错误感到遗憾。
p.s.如果您认为我的未签名实施也不理想,请随时指出。