将一个非常大的二进制数转换为十进制并打印出来

5
我知道如何将二进制转换为十进制,我至少知道两种方法:表格法和幂法。
我想将二进制转换为十进制并打印该十进制数。此外,我不关心这个"十进制",我只想打印出结果。
但是,正如我上面所写的,我只知道两种将二进制转换为十进制的方法,它们都需要加法。因此,我计算二进制中1或0的某些值,并将其加到记住的值中。这是一个薄弱环节。我有一个真正巨大的数字(1和64个零)。在转换时,我需要将一些中间结果放入某个“变量”中。在C语言中,我有一个“int”类型,它只有4个字节,不超过10的11次方。
因此,在从二进制转换为十进制时,我没有足够的内存来存储中间结果。正如我上面所写的,我不关心那个十进制数,我只想打印结果。但是,我没有看到其他解决办法;-(有没有办法从二进制中“只打印”结果?
或者,也许我应该使用类似BCD(二进制编码十进制)的中间表示?我真的不想使用它,因为它不太跨平台(英特尔的处理器有一个内置功能,但对于其他处理器,我需要编写自己的实现)。
我很乐意听听您的想法。感谢您的耐心。
语言:C。

1
只是一个问题,这个二进制数是如何存储的? - Paulo Santos
将随机位(或四位序列)转换为十进制数字并不是一件简单的事情。我们最希望能够做到这一点的情况是使用BPP算法计算圆周率:您可以计算任何位数或任何十六进制数字,但是使用该算法无法获取十进制数字(除非您想进行大量转换)。 - Fixee
5个回答

6

我强烈建议使用类似GMP(GNU多精度库)的库。您可以使用mpz_t数据类型处理大整数,使用各种导入/导出例程将数据转换为mpz_t,然后使用mpz_out_str()在十进制中打印输出。


赞同。GMP使这些东西变得容易。 - Dietrich Epp
我对GMP很了解,但这不是我想要的。 - AlannY
1
为什么你不想使用GMP?LGPL对你来说不起作用吗?只需要大约3个函数调用就可以实现你想要的功能(导入,打印,清理),而且它比你能想出的任何东西都更快、更少出错。 - Adam Rosenfield

4

最大的标准整数数据类型是unsigned long long int-在我的系统上(32位Linux on x86),它的范围为0-1.8*10^20,这对您来说不够用,因此您需要创建自己的类型(结构或数组)并为该类型编写基本数学运算(基本上只需要加法)。

如果我是你(而且内存不是问题),我会使用一个数组-每个十进制数字一个字节,而不是BCD。BCD更紧凑,因为它每个字节存储2个十进制数字,但是您需要花费更多的精力分别处理高位和低位。

要打印,您只需将'0'(字符,而不是数字)添加到数组的每个字节中,就可以得到可打印的字符串。


是的,在经过一夜的思考后,我得出了相同的解决方案;-) - AlannY

0

当将二进制转换为十进制时,您实际上不需要同时使用所有二进制位。您只需要当前计算幂的位以及可能需要一个双精度变量来保存结果。 您可以将二进制值放入数组中,比如i[64],遍历它,根据其位置获取幂并将其添加到双精度变量中。


3
需要很多个什么?999999转换成十六进制是0xf423f,但如果你改变第二位最不重要的十六进制数字中的一个比特(例如变成0xf427f),每个十进制数字都会改变,结果是1000063。 - Chris

0

将数字转换为十进制实际上意味着计算每个十的幂,那么为什么不将它们存储在字节数组中呢?然后打印只需循环遍历该数组。


-2

你不能为5个int分配内存,然后将数字存储在数组的开头吗?然后手动迭代int大小的块。可能像这样:

int* big = new int[5];
*big = <my big number>;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接