所以这是我的代码
void ascToBinary(int character, int *ones)
{
if(character == 1)
{
printf("1");
*ones+=1;
return;
}
else
{
if((character%2) == 0)
{
printf("0");
character = character/2;
}
else
{
printf("1");
character = character/2;
*ones+=1;
}
binaryPrinter(character, ones);
}
}
任何人都可以尝试帮助我解决这里出了问题的地方。它编译得很好并且一些ascii字母是正确的。如果您尝试'e',它会打印出'1010011'而不是正确的二进制文件。
所有帮助表示感谢Guies。
答案 0 :(得分:4)
您以错误的顺序打印结果。正确的输出是'1100101'。你可以像这样翻转它:
void ascToBinary(int character, int *ones)
{
if(character == 1)
{
printf("1");
*ones+=1;
return;
}
else
{
char out;
if((character%2) == 0)
{
out = '0';
character = character/2;
}
else
{
out = '1';
character = character/2;
*ones+=1;
}
ascToBinary(character, ones);
putchar (out);
}
}
答案 1 :(得分:1)
您正在反向打印字符的位,因为您使用最低位开始打印。
因此,在e
上调用时,您的函数的预期值为1010011
,这正是您所获得的。
答案 2 :(得分:1)
将整数转换为二进制:
版本1 - 将打印出二进制结果
void to_bin(int value)
{
char base_range[] = "01";
if (value >= 2) {
to_bin(value / 2);
}
printf("%c", base_range[value % 2]);
}
版本2 - 将返回包含二进制结果的字符串
void to_bin_str(int value, char *res, int *p)
{
char base_range[] = "01";
if (value >= 2) {
to_bin_str(value / 2, res, p);
}
res[(*p)++] = base_range[value % 2];
}
char* convert(int value)
{
char* result = (char*)malloc(sizeof(char) * 32);
int i = 0;
to_bin_str(value, result, &i);
result[i] = '\0';
return (result);
}
版本3 - 将转换为2到16之间的任何基数,处理基数为10的负数
void to_base(int value, int base, char *res, int *p)
{
char base_range[] = "0123456789ABCDEF";
if (value >= base || value <= -base) {
to_base(value / base, base, res, p);
}
res[(*p)++] = base_range[abs(value % base)];
}
char* convert(int value, int base)
{
char *result = (char*)malloc(sizeof(char) * 32);
int i = 0;
if (base < 2 || base > 16)
return (NULL);
if (base == 10 && value < 0)
result[i++] = '-';
to_base(value, base, result, &i);
result[i] = '\0';
return (result);
}