前言
我正在通过编写和改进我自己的 BigInt 库来学习计算机数学。到目前为止,我的第一个版本将基数为 10 的数字的每个数字存储在向量的连续元素中。它可以以任意精度进行乘法和加法。我想通过转换为基数 2^x 来使用标准 C++ 数据类型中的所有可用空间来加速它。
信息
我正在从以 10 为底的标准输入读取 1000 个或更多数字,我希望将它们转换为以 2^x 为底的数字,因此我可以轻松地将它们存储在标准 C++ 数据类型之一的数组或向量中,可能是无符号整数。我对如何进行基本转换只有一个想法,即用余数重复除法。下面是一些描述该方法的 C++ 代码:
vector<int> digits;
while(num!=0) {
int mod = num%base;
num = num/base;
digits.push_back(mod);
}
难题
我迷失的一些事情是除以余数是否是对大整数进行基数转换的正确方法。我试过看看GMP 库是如何做到的。gmp/mpn/generic/set_str.c是“魔术”发生的相关c源文件,但我不确定那里发生了什么。Matt McCutchen 的BigInt似乎使用了带余数的重复除法。如果我确实使用这种方法,我基本上需要编写我的 BigInt 类的两个版本,一个用于在 Base10 中工作,另一个用于 Base2^x。
结论
- 提供有关将大量数字从字符串转换为 32 位字数组的正确步骤的建议。
- 帮助我了解 GMP 如何将字符串转换为 32 位字数组,而无需涉足许多抽象层。
使用 4 位字长的示例
我们要存储的号码(显然在小号上):123456789
无符号字符的范围为 0-255,如果我们想拆分我们的数字并将其存储在向量中,我们可以通过以下三种方式之一进行:
- 作为基数 10,我们的向量看起来像:[1,2,3,4,5,6,7,8,9]
- 这就是我的向量在我的第一个实现中的样子。
- 作为基数 100,我们的向量看起来像:[1,23,45,67,89]
- 易于从基数 10 转换为基数 100,具有 ciel(base10/2 中的数字)元素。
- 作为基数 256,我们的向量看起来像:[7,91,205,21]
显然,第三种解决方案是内部表示的最佳解决方案,也是我想要达到的。