我最近开始再次与C合作(自我上学的第一个学期以来没有接触过它)并且一直在处理字符串。
目前,我正在编写一个函数,它将一个整数转换为字符串形式的二进制表示。
以下是我必须执行此操作的代码:
#include <stdio.h>
float power(int, int); //My version of the pow() function from math.h
char* itob(int);
int main ()
{
int x = 63;
const char * bin_x = itob(x);
printf("x = %d (%s)",x,bin_x);
return 0;
}
char* itob(int a){
static char bin[100];
int i;
for(i=0;((int) power(2,i) < a);i++){
bin[i] = (int)((a & ((int) power(2,i))) >> i);
}
bin[i] = '\0';
return (char*)&bin;
}
我遇到的问题是 a 上的二进制操作的结果我存储在 bin [] 的元素中似乎是'\ 001 '或'\'',而不是简单的'1'或'0'。因此,当我在main()中printf()结果时,输出看起来像一个丢失的字符框,或者如果有一个0(如果 x = 62而不是63),则将其解释为字符串结尾'\ 0'。
我是否错误地将这些元素存储到我的字符串中?
答案 0 :(得分:3)
是的,您存储错误。您存储的是0或1,但您需要存储其编码。
尝试替换此行:
bin[i] = (int)((a & ((int) power(2,i))) >> i);
使用:
bin[i] = (int)((a & ((int) power(2,i))) >> i) ? '1' : '0';
你可以简单地return bin;
,既不需要演员,也不需要使用运营商的地址。
答案 1 :(得分:0)
不要使用电源功能,效率非常低,只需换班即可。你的程序浪费了很多时间在int和float之间进行转换,而另外几百个周期的电源转换只需要1个或几个周期。并且无需强制转换为int,任何短于或等于int的类型都将自动提升为int
bin[i] = a & (1 << i) ? '1' : '0';
// or:
bin[i] = (a >> i) & 1 ? '1' : '0';
更清洁,更短,更快。分支导致性能不佳的另一种方法
bin[i] = ((a >> i) & 1) + '0';