如何使用16位内存位置乘以两个23位数字

时间:2012-01-20 04:26:11

标签: binary hardware multiplication

如果只有16位的内存位置,如何将两个无符号的23位数相乘?

我没有使用x86指令执行这些操作,因此将忽略与x86相关的信息。

1 个答案:

答案 0 :(得分:4)

我认为你的意思是你一次只能乘两个16位数字。

首先,我要说ab是我们想要成倍增加的数字。它们的大小在17到32位之间(覆盖了23位)。无论它们多么大,它们都是零填充到无符号的32位大小。

r = a * b

可以重写为

r = (al + (ah << 16)) * (bl + (bh << 16))

其中alaha的低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*blal*bhah*bl&amp; ah*bh),然后移动结果并将它们加在一起。请记住,每个16位乘法产生一个32位结果,因此整个过程将进入64位。在您的情况下,因为您知道a&amp; b不大于2 ^ 23整个事物将适合46位。

另一个原因是总和需要在16位块中完成,并且需要处理进位。

希望有所帮助。