TLDR,在底部:)
简介: 我正在创建一个用于处理大量数字的基本算术库(加法,减法...)。我面临的问题之一是将这些巨大的二进制数打印为十进制。
我在uint64_t数组中存储了巨大的二进制数。例如
uint64_t a[64] = {0};
现在,目标是在控制台/文件中打印64 * 64位二进制数作为其十进制值。
初步工作: 为了详细说明该问题,我想描述如何打印十六进制值。
int i;
int s = 1;
a[1] = (uint64_t)0xFF;
for(i = s; i>= 0; i--)
{
printf("0x%08llX, ", a[i]);
}
输出:
0x000000FF, 0x00000000,
类似地,为了打印OCT值,我可以从a [64]中获取LSB 3位,打印这些位的十进制等效值,3位右移a [64]的所有位,并一直重复直到a [[]的所有值64]已打印。 (以反转顺序打印,以使第一个十进制数字保持在右侧)
仅通过重复此单位算法,我就可以打印大小不受限制的二进制十六进制和十进制值,但是我找不到/开发一个十进制数,可以重复一遍以打印a [64](或类似的东西)更大)。
我的想法 我最初的想法是继续减去
max_64 =(uint64)10000000000000000000; //(i.e.10^19)
uint64_t内部最大的10的倍数,从a
到a
内部的值小于max_64(基本上等于rem_64 = a%max_64
),然后使用打印出rem_64的值>
printf("%019llu",rem_64);
,它是数字a
的前19个十进制数字。
然后执行类似于(不是代码)的算术运算:
a = a/max_64; /* Integer division(no fractional part) to remove right most 19 dec digits from 'a' */
,并继续重复并打印19个十进制数字。 (以这样的方式打印:首先找到的19位数字在右边,然后在其左边的19位数字,依此类推...)。
问题是此过程很长,我不想使用所有这些仅打印dec值。并且一直在寻找一种避免使用这些耗时的算术运算的过程。
我相信必须有一种方法,只需重复一个算法即可打印出大尺寸的纸张(类似于十六进制和十进制的打印方式),希望我能指出正确的方向。
我的图书馆可以做的事情(到目前为止):
如果需要,我将为其他操作编写代码,但是如果可能,我想独立于库来实现打印功能。
考虑这样的问题: 您已得到n位二进制数字X(1 <= n <= 64 * 64),必须以十进制打印X。如果绝对需要,您可以使用现有的库,如果未使用,则可以使用。
TLDR: 我可以重复使用的任何代码,引用或单位算法来打印太大和/或未知大小的二进制十进制值将很有帮助。强调算法,即,如果有人可以描述一个我可以实现的过程,我就不需要代码。预先感谢。
答案 0 :(得分:2)
面对这样的疑问,并且鉴于那里有很多bigint库,研究它们的代码很有趣。我看过Java的BigInteger,它有一个 validates :column_name, presence: true
方法,它们有两件事:
对于小数字,他们咬紧牙关,并进行something similar to what you proposed-直接的逐链接基础转换,在每一步中输出十进制数字。
对于大量数字,他们使用递归Schönhage algorithm,quote in the comments在其他地方也被引用,
Knuth,唐纳德,计算机编程的艺术,第一卷。 2,答案 练习(4.4)问题14。