算法使用32位无符号整数乘以64位数

时间:2011-09-27 13:31:16

标签: c++ c algorithm

我有64位数字(63位+符号位),表示为2的补码数,存储在两个无符号32位整数中。

struct Long
{
    uint32 high;
    uint32 low;
}

如何实现乘法算法,仅使用32位数,并检查结果是否适合63位,我想返回一个错误代码,如果结果不适合则表示溢出。

2 个答案:

答案 0 :(得分:5)

一般来说你需要2 * n位来存储两个n位数的乘积(最大结果是(2 ^ n)^ 2 = 2 ^(2 * n)),所以我最好的想法是将数字分开分成四个16位部分,将它们逐个相乘并将它们相加。总共16次乘法,但错误检查很简单。

答案 1 :(得分:1)

查看GNU MP library中的'longlong.h'头文件。我相信这个标题的一个版本也在GNU C源代码中。宏: smul_ppmm 是根据无符号双字产品定义的: umul_ppmm 。这为您提供32x32 => 64位乘法,您可以使用它来实现64x64 => 128位乘法。