您正在尝试获取 base-10 表示(即数组的每个单元格中的十进制数字)。这样,空间(每个数字一个 int)或时间(每个 dgit 4 位,但存在打包/解包的开销)都被浪费了。
例如,为什么不尝试使用 base-256 并使用字节数组?甚至是带有整数数组的base-2 ^ 32?这些操作的实现方式与 base-10 相同。唯一不同的是将数字转换为人类可读的字符串。
它可能是这样工作的:假设 base-256,每个“数字”有 256 个可能的值,所以数字 0-255 都是单个数字值。比 256 写成 1:0 (我将使用冒号分隔“数字”,我们不能使用 base-16 中的字母),base-10 中的类比是 9 之后有 10。同样 1030(base -10) = 4 * 256 + 6 = 4:6 (base-256)。1020 (base-10) = 3 * 256 + 252 = 3:252 (base-256) 也是 base-256 中的两位数。
现在让我们假设我们把数字放在字节数组中,首先是最低有效位:
unsigned short digits1[] = { 212, 121 }; // 121 * 256 + 212 = 31188
int len1 = 2;
unsigned short digits2[] = { 202, 20 }; // 20 * 256 + 202 = 5322
int len2 = 2;
然后添加将像这样(警告:前面的记事本代码,可能会被破坏):
unsigned short resultdigits[enough length] = { 0 };
int len = len1 > len2 ? len1 : len2; // max of the lengths
int carry = 0;
int i;
for (i = 0; i < len; i++) {
int leftdigit = i < len1 ? digits1[i] : 0;
int rightdigit = i < len2 ? digits2[i] : 0;
int sum = leftdigit + rightdigit + carry;
if (sum > 255) {
carry = 1;
sum -= 256;
} else {
carry = 0;
}
resultdigits[i] = sum;
}
if (carry > 0) {
resultdigits[i] = carry;
}
在第一次迭代中,它应该是这样的:
- 总和 = 212 + 202 + 0 = 414
- 414 > 256,所以进位 = 1 和 = 414 - 256 = 158
- 结果数字[0] = 158
在第二次迭代中:
- 总和 = 121 + 20 + 1 = 142
- 142 < 256,所以进位 = 0
- 结果数字[1] = 142
所以最终结果digits[] = { 158, 142 },即142:158(base-256)= 142 * 256 + 158 = 36510(base-10),正好是31188 + 5322
请注意,将此数字转换为人类可读的形式绝非易事——它需要乘以 10 或 256,如果没有适当的研究,我无法将代码作为示例提供。优点是可以使“加法”、“减法”和“乘法”操作非常有效,并且在开始时和计算结束后只进行一次与 base-10 的大量转换。
说了这么多,就个人而言,我会在字节数组中使用以 10 为底的值,而不关心内存丢失。这需要将上面的常数 255 和 256 分别调整为 9 和 10。