算术运算仅使用32位整数

时间:2015-03-07 00:58:11

标签: algorithm bit multiplication bigint

如何在一个只能乘32位数的微处理器上计算两个1024位数的乘法?

2 个答案:

答案 0 :(得分:1)

出发点是要意识到你已经知道如何做到这一点:在小学你被教导如何对单位数字进行算术运算,然后给出数据结构来表示更大的数字(例如小数)和算法来计算算术运算(例如长除法)。

如果你有办法将两个32位数相乘得到64位结果(注意unsigned long long保证至少为64位),那么你可以使用那些相同的算法来算术在基地2 ^ 32。

您还需要,例如,带有进位操作的添加。通过检测溢出,例如,添加两个相同类型的无符号数时,可以确定进位。如下:

uint32_t x, y; // set to some value
uint32_t sum = x + y;
uint32_t carry = (sum < x);

(从技术上讲,这种操作需要你做无符号算术:带符号算术中的溢出是未定义的行为,优化器会对你最不期望的代码做出令人惊讶的事情)

(现代处理器通常会提供一种方法来将两个64位数相乘以得到128位结果,但要访问它,您将不得不使用128位类型的编译器扩展,否则您必须编写内联汇编代码。现代处理器也有专门的附加携带指令)

现在,有效地算术 是一个巨大的项目;我发现浏览文档和源代码到GNU多精度算术库gmp是非常有益的。

答案 1 :(得分:0)

  1. 查看bigint操作的任何实现

    • 这里有一些用于fast bignum square
    • 的C ++中的一些方法
    • 有些仅用于sqr,但其他可用于乘法......
  2. 使用32位算术作为64/128/256 / ...位算术的模块