如何在只有32位int的系统上模拟256位整数运算?

时间:2012-01-05 12:15:25

标签: c++ c++11 int64

我想用一系列(无符号)整数编写一个简单的bignum类。我可以松散地看到加法和减法是如何工作的,但除法和乘法是另一个故事。我知道32位编译器可以通过在两个int32中分割int64来模拟64位int。我正在寻找一种有效的方法来做到这一点。

我想要C ++代码,而不是汇编代码。速度不是主要考虑因素,但没有组装的最有效解决方案总是很好。

6 个答案:

答案 0 :(得分:4)

也许this可以作为起点。它使用base-65,536表示实现多达2,048位无符号整数。这意味着每个数字都适合16位,我们可以通过简单地使用32位来检测溢出(即使在乘法时)。

然而,这是C代码,但是移植到C ++应该是微不足道的,或者只是用作灵感。它非常适合于可读性而非速度,因为这不是我擅长的那种东西。 :)

答案 1 :(得分:1)

你最好看一下arbitrary precision arithmetic,它将解释模拟高精度处理器的过程背后的思考,而不是运行代码的过程。

答案 2 :(得分:0)

使用long long有什么问题?这保证是在 至少64位。否则,你的Knuth(第2卷)应该提供基本的 算法。

答案 3 :(得分:0)

使用简单的字节数组。无论你想要什么,你都可以得到整数大小*。你只需要操作二进制并考虑结束(你的位将是7-6-5-4-3-2-1-0-15-14-13 ...)

* RAM有限

答案 4 :(得分:0)

对于任意大小,给GMP一个旋转,如果由于某种原因你不能依赖编译器为你做这个,它也适用于32位的64位数学运算。

答案 5 :(得分:0)

购买一本名为NUMERICAL RECIPES IN C ++的精装书,你会在20.6页p916到p925的页面上找到你想要的东西