我需要使用C编程将20位十进制转换为二进制。我该怎么做呢真的,我觉得很难。我将创建什么缓冲区,因为它会非常大,即使计算器也无法计算将20位数转换为二进制数。
我需要建议,链接和可能的示例代码。
感谢。
答案 0 :(得分:1)
您是否需要将十进制字符串转换为二进制字符串或值?
经验法则10 ^ 3~ = 2 ^ 10,因此10 ^ 20~ = 2 ^ 70> 64位(67准确)。==> 64位整数是不够的。你可以使用2个64位整数(长C)或者上部8位字节和下部64位结构。 确保下半部分未签名。
您需要编写检查下部溢出的代码,并在发生这种情况时增加上部。一旦越过64位线,您还需要使用长除法算法。
答案 1 :(得分:1)
使用库进行扩展精度算术怎么样?试着看看http://gmplib.org/
答案 2 :(得分:0)
我不知道你是不是想把一串数字字符转换成一个非常大的int,或者把一个非常大的int转换成一个1s和0s的字符串......但总的来说,你会做一些事情像这样:
for (i = 0; i < digits; i++)
{
bit[i] = (big_number>>i) & 1;
// or, for the other way around
// big_number |= (bit[i] << i);
}
主要问题是没有可以存储“big_number”的内置类型。所以你可能会更喜欢这样做......
uint8_t big_number[10]; // the big number is stored in 10 bytes.
// (uint8_t is just "unsigned char")
for (block = 0; block < 10; block++)
{
for (i = 0; i < 8; i++)
{
bit[block*8 + i] = (big_number[block]>>i) & 1;
}
}
[编辑]
要将一串数字字符读入int(不使用scanf
或atoi
等),我会这样做:
// Supposing I have something like char token[]="23563344324467434533";
int n = strlen(token); // number of digits.
big_number = 0;
for (int i = 0; i < n; i++)
{
big_number += (token[i] - '0') * pow(10, n-i-1);
}
这将有助于读取数字,但同样,问题是没有内置类型来存储big_number。你可以使用一个浮点数或一个双精度数,这样可以得到数字的大小正确,但最后几位小数将被四舍五入。如果您需要完美的精度,则必须使用任意精度整数。谷歌搜索出现了几个可能的库用于此;但我对这些图书馆没有太多的个人经验,所以我不会提出建议。
但实际上,您使用的数据类型取决于您之后要对数据执行的操作。也许你需要一个任意精度的整数,或者double
可能正是你所需要的;或者你可以使用我在uint8_t
块中概述的技术编写你自己的基本数据类型,或者你最好把它留作字符串!