在C字符串中放置'0'和'1'字符

时间:2014-05-28 17:36:35

标签: c string

我最近开始再次与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'。

我是否错误地将这些元素存储到我的字符串中?

2 个答案:

答案 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';