char *toBin(unsigned long long num)
{
char s[9999];
const int size= 9999;
char *temp = new char[size];
int i, j;
int binBase = 2;
for(i=0; num!= 0; i++)
{
s[i] = num % binBase + '0';
num /= binBase;
}//get backwards binary
for(j=0; i>=0; j++)
{
i--;
temp[j]=s[i];
}//reverse binary sequence
//increments one more so need to decrement
temp[--j] = '\0';
return temp;
delete temp;
}
如果我在char数组中有“82”,我首先将“82”转换为小数82,并将82转换为上述函数以转换为二进制。这仅适用于某个数字限制。
我认为我的问题是unsigned long long只能保存一定数量的数字,所以当超过该限制时,会向函数发送一些随机内容,这会打印出错误的二进制文件。
上面的函数将unsigned long long num转换为binary。我意识到更好的方法是查看char数组中的每个字符,而不是先将其转换为数字,然后使用这些值转换为二进制。但是,我很难将其用于代码。任何建议或帮助将不胜感激。
答案 0 :(得分:0)
char
的数组是不明智的,因为它可能对您的平台来说太大了。无论如何,您可以轻松计算所需的最大位数(+终结符):CHAR_BIT*sizeof num+1
。答案 1 :(得分:0)
GNU Multiple Precision(GMP)库具有在任何基础上打印任何大小编号的功能。以下是一个例子。
#include <iostream>
#include <gmpxx>
int main()
{
std::string numstr = "1234123412341234123412341234";
// initialize mpz_class to have numstr in it (given in base 10)
mpz_class bigint(numstr, 10);
// convert to binary (base 2)
std::string binstr = bigint.get_str(2);
std::cout << numstr << " -> " << binstr << std::endl;
return 0;
}
程序输出
1234123412341234123412341234 -> 111111110011010111110011000011110100100000101001110100011000000101000011000000000111110010