我们正在使用以下算法进行一些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)~~~
我的问题,
他们有更好的方法吗?
答案 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位结果,这一点曾经很重要,但大多数人都不必担心。