将真正的大数字从二进制转换为十进制并打印出来

时间:2009-06-06 18:31:45

标签: c binary decimal bignum bcd

我知道如何将二进制转换为十进制。我知道至少有两种方法:桌子和电源; - )

我想将二进制转换为十进制并打印此小数。而且,我对这个“十进制”不感兴趣;我想要打印它。

但是,正如我上面所写,我只知道将二进制转换为十进制的两种方法,并且它们都需要添加。所以,我在二进制中计算1或0的某个值,并将其添加到记忆值。这是一个很薄的地方。我有一个非常大的数字(1和64个零)。转换时我需要在某些“变量”中放置一些中间结果。在C中,我有一个`int'类型,它只有4个字节,不超过10 ^ 11。

因此,在从二进制转换为十进制时,我没有足够的内存来存储中间结果。正如我上面所写,我对这个小数点不感兴趣,我只想打印结果。但是,我没有看到任何其他方法来解决它;-(是否有任何解决方案从二进制“只打印”?

或者,也许,我应该使用类似BCD(二进制编码的十进制)的东西进行中间表示?我真的不想使用它,因为它不是那么跨平台(英特尔的处理器有内置功能,但对于其他我需要编写自己的实现)。

我很高兴听到你的想法。感谢您的耐心等待。

语言:C。

5 个答案:

答案 0 :(得分:6)

我强烈建议使用GMP(GNU multiprecision库)等库。您可以将mpz_t数据类型用于大整数,使用各种import/export routines将数据转换为mpz_t,然后使用mpz_out_str()将其打印在基数10中。

答案 1 :(得分:4)

最大的标准整数数据类型是unsigned long long int - 在我的系统上(x86上的32位Linux)它的范围是0 - 1.8 * 10 ^ 20这对你来说还不够,所以你需要创建自己的类型(结构或数组)并为该类型编写基本数学(基本上只需要一个补充)。

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

要打印,只需将'0'(字符,而非数字)添加到数组的每个字节,即可获得可打印的字符串。

答案 2 :(得分:0)

那么,当从二进制转换为十进制时,您实际上并不需要同时使用所有二进制位。你只需要你正在计算功率的位数,并且可能需要一个双变量来保存结果。 你可以将二进制值放在一个数组中,比如i [64],迭代它,根据它的位置获得幂并继续将它添加到double。

答案 3 :(得分:0)

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

答案 4 :(得分:-2)

你不能为5个int分配内存,并将你的号码存储在数组的开头吗?然后以int大小的块手动迭代数组。也许是这样的事情:

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