TLDR,在底部:)
简介: 我正在创建一个用于处理大量数字的基本算术库(加法,减法...)。我面临的问题之一是将这些巨大的二进制数打印为十进制。
我在uint64_t数组中存储了巨大的二进制数。例如
uint64_t a[64] = {0};
Run Code Online (Sandbox Code Playgroud)
现在,目标是在控制台/文件中打印64 * 64位二进制数作为其十进制值。
初始工作: 为了阐述这个问题,我想描述如何打印十六进制值。
int i;
int s = 1;
a[1] = (uint64_t)0xFF;
for(i = s; i>= 0; i--)
{
printf("0x%08llX, ", a[i]);
}
Run Code Online (Sandbox Code Playgroud)
输出:
0x000000FF, 0x00000000,
Run Code Online (Sandbox Code Playgroud)
同样,对于打印OCT值,我只能从a [64]中取LSB 3位,打印与这些位等效的十进制数,向右移3位a [64]的所有位,并继续重复直到a [64]的所有值都已打印。(以反转顺序打印,以使第一个十进制数字保持在右侧)
我可以通过重复此单位算法来打印大小不受限制的二进制十六进制和十进制值,但是我找不到/开发一个十进制的值,可以重复一遍以打印a [64](或更大的值)。
我想到的是: 我最初的想法是继续减去
max_64 =(uint64)10000000000000000000; //(i.e.10^19)
Run Code Online (Sandbox Code Playgroud)
uint64_t内部最大的10的倍数,a直到内部的值a小于max_64(基本上等于rem_64 = a%max_64),然后使用以下命令打印rem_64值
printf("%019llu",rem_64);
Run Code Online (Sandbox Code Playgroud)
这是数字的第19个十进制数字a。
然后执行类似于(不是代码)的算术运算:
a = a/max_64; /* Integer division(no fractional part) to remove right most 19 dec digits from 'a' */ …Run Code Online (Sandbox Code Playgroud)