如果只有16位的内存位置,如何将两个无符号的23位数相乘?
我没有使用x86指令执行这些操作,因此将忽略与x86相关的信息。
答案 0 :(得分:4)
我认为你的意思是你一次只能乘两个16位数字。
首先,我要说a
和b
是我们想要成倍增加的数字。它们的大小在17到32位之间(覆盖了23位)。无论它们多么大,它们都是零填充到无符号的32位大小。
r = a * b
可以重写为
r = (al + (ah << 16)) * (bl + (bh << 16))
其中al
和ah
是a
的低16位和高16位。移位16与乘以2 ^ 16相同。然后我们可以扩展这个等式。
r = (al + (ah * 2^16)) * (bl + (bh * 2^16))
r = al * bl + al * (bh * 2^16) + (ah * 2^16) * bl + (ah * 2^16) * (bh * 2^16)
r = al * bl + al * bh * 2^16 + ah * bl * 2^16 + ah * bh * 2^32
r = al * bl + (al * bh + ah * bl) << 16 + (ah * bh) << 2^32
所以最终得到4次乘法(al*bl
,al*bh
,ah*bl
&amp; ah*bh
),然后移动结果并将它们加在一起。请记住,每个16位乘法产生一个32位结果,因此整个过程将进入64位。在您的情况下,因为您知道a
&amp; b
不大于2 ^ 23整个事物将适合46位。
另一个原因是总和需要在16位块中完成,并且需要处理进位。
希望有所帮助。