用于打印巨大(超过128位)二进制数的十进制值的算法?

时间:2019-04-23 10:23:28

标签: c algorithm data-conversion

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的倍数,从aa内部的值小于max_64(基本上等于rem_64 = a%max_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值。并且一直在寻找一种避免使用这些耗时的算术运算的过程。

我相信必须有一种方法,只需重复一个算法即可打印出大尺寸的纸张(类似于十六进制和十进制的打印方式),希望我能指出正确的方向。

我的图书馆可以做的事情(到目前为止):

  • 添加(使用全加)
  • Sub(使用全减)
  • 比较(通过比较数组大小和比较数组元素)
  • Div(整数除法,无小数部分)
  • 模量(%)
  • 乘法(基本上是多次加法:()

如果需要,我将为其他操作编写代码,但是如果可能,我想独立于库来实现打印功能。

考虑这样的问题: 您已得到n位二进制数字X(1 <= n <= 64 * 64),必须以十进制打印X。如果绝对需要,您可以使用现有的库,如果未使用,则可以使用。

TLDR: 我可以重复使用的任何代码,引用或单位算法来打印太大和/或未知大小的二进制十进制值将很有帮助。强调算法,即,如果有人可以描述一个我可以实现的过程,我就不需要代码。预先感谢。

1 个答案:

答案 0 :(得分:2)

面对这样的疑问,并且鉴于那里有很多bigint库,研究它们的代码很有趣。我看过Java的BigInteger,它有一个 validates :column_name, presence: true 方法,它们有两件事:

  

Knuth,唐纳德,计算机编程的艺术,第一卷。 2,答案   练习(4.4)问题14。