5

我知道如何将二进制转换为十进制。我至少知道 2 种方法:表格和电源 ;-)

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

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

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

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

我很高兴听到你的想法。谢谢你的耐心。

语言:C.

4

5 回答 5

6

我强烈推荐使用诸如GMP(GNU 多精度库)之类的库。您可以将mpz_t数据类型用于大整数,使用各种导入/导出例程将数据放入mpz_t中,然后使用mpz_out_str()以 10 为基数打印出来。

于 2009-06-06T20:02:56.293 回答
4

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

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

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

于 2009-06-06T19:56:13.797 回答
0

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

于 2009-06-06T18:45:33.747 回答
0

Converting to decimal really means calculating each power of ten, so why not just store these in an array of bytes? Then printing is just looping through the array.

于 2009-06-06T20:35:05.450 回答
-2

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

int* big = new int[5];
*big = <my big number>;
于 2009-06-06T18:40:02.417 回答