1

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

我想要 C++ 代码,而不是汇编。速度不是主要问题,但没有 assemble 的最有效的解决方案总是很高兴。

4

6 回答 6

4

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

然而,这是 C 代码,但应该很容易移植到 C++,或者只是用作灵感。它针对可读性而不是速度进行了非常优化,因为这并不是我擅长的那种东西。:)

于 2012-01-05T12:24:55.603 回答
1

您最好看一下任意精度算术,这将解释模拟比您的代码运行的更高精度处理器的过程背后的想法。

于 2012-01-05T12:27:53.870 回答
0

只是使用有什么问题long long?保证至少为 64 位。否则,您的 Knuth (vol. 2) 应该提供基本算法。

于 2012-01-05T12:27:55.053 回答
0

使用简单的字节数组。你可以有任何你想要的整数大小*。您只需要以二进制操作并考虑字节序(您的位将是 7-6-5-4-3-2-1-0-15-14-13...)

*内存有限

于 2012-01-05T12:28:07.183 回答
0

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

于 2012-01-05T12:32:08.120 回答
0

购买一本名为 C++ NUMERICAL RECIPES 的精装书,您会在从 20.6 页 p916 到 p925 的页面上找到您要查找的内容

于 2015-04-17T12:22:20.947 回答