在不使用64位int的情况下将两个32位数相乘

时间:2009-08-31 01:45:05

标签: algorithm 32bit-64bit multiplication

我们正在使用以下算法进行一些32位* 32位乘法

让我们想要将(32位)与b(32位)相乘,两者都是有符号的,

a = ah * 2 ^ 16 + al [ah - 高16位,al - 低16位]

b = bh * 2 ^ 16 + bl [bh - 高16位,bl - 低16位]

我们正在有效地做

结果=(al * bl)+(((ah * bl)+(al * bh))* 2 ^ 16)+((ah * bh)* 2 ^ 32)~~~


我的问题,

他们有更好的方法吗?

4 个答案:

答案 0 :(得分:7)

在任何主流编译器中,32位平台上的64位整数仿真与自己进行多步数学的效率差不多。但它会更可靠地纠正。

当使用大到足以溢出的值进行简单算术时,即使是我见过的最高度调整的数学库也只使用int64。

答案 1 :(得分:4)

Google“Karatsuba multiplication”。

OIh,在你的代码中,将常量2 ^ 15(它出现两次)更改为2 ^ 16。

答案 2 :(得分:3)

答案是没有更好的做事方式,除了使用位移和掩码而不是2 ^ n。即:

a * 2^n <=> a << n

其次,您的签名是签名还是未签名?如果他们签了那么就会改变一切。

第三,我不确定你的2 ^ 15是对的。如果它至少是无符号的,你想要将位移16而不是15。

最后,你必须注意低阶int中的整数溢出。如果你将低位数字中的数字加在一起溢出它的容量,你需要正确地增加高阶int。

答案 3 :(得分:1)

您需要知道(指定)64位值的存储方式 - 可能是,它是一对32位值,可能是数组的两个元素,或者是结构的两个元素。您还需要考虑如何将符号信息存储在结果中。

从机制上讲,您可能希望将两个有符号值转换为无符号值,然后沿着显示的行进行拆分和重组,小心确保从高位开始正确管理低位32位值的进位32位值。

根据您的初始设计决定,您可能还需要尝试结果符号的表示,甚至是其他所有位。

类似的评论适用于将两个16位数相乘而没有任何32位结果,这一点曾经很重要,但大多数人都不必担心。