在只能乘以32位数字的微处理器上,如何计算两个1024位数字的乘法?
最佳答案
起点是要认识到你已经知道如何做到这一点:在小学,你被教导如何在一位数上做算术,然后给你数据结构来表示更大的数字(例如小数)和算法来计算算术运算(例如长除法)。
如果你有办法将两个32位数字相乘得到一个64位的结果(注意unsigned long long
保证至少是64位),那么你可以使用这些相同的算法在基数2^32中进行运算。
您还需要,例如,一个add-with-carry操作。通过检测溢出,可以在添加两个相同类型的无符号数字时确定进位,例如:
uint32_t x, y; // set to some value
uint32_t sum = x + y;
uint32_t carry = (sum < x);
(从技术上讲,这类操作要求您执行无符号算术:有符号算术中的溢出是未定义的行为,优化器将对您的代码执行出乎意料的操作)
(现代处理器通常会让两个64位数字相乘得到128位的结果,但是要访问它,您必须使用像128位类型这样的编译器扩展,否则您必须编写内联汇编代码。现代处理器也有专门的进位指令)
现在,高效地做算术是一个巨大的工程;我发现浏览GNU多精度算术库
gmp
的文档和源代码非常有指导意义。关于algorithm - 仅使用32位整数的算术运算,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28910182/