如何在一个只能乘32位数的微处理器上计算两个1024位数的乘法?
答案 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)
查看bigint操作的任何实现
使用32位算术作为64/128/256 / ...位算术的模块
2^32