我正在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.如果您認爲我的未簽名實施也不理想,請隨時指出。