在char数组中存储十进制二进制

时间:2015-06-25 11:49:42

标签: c arrays binary bit-shift

我想通过应用下面的代码在char数组中存储二进制等效的十进制数,但问题是我无法保存十进制数的最后一位。我得到了垃圾值。

 int k,j;
 char c[40];
 j=32;
 scanf("%d",&k);

 while(k)
 {    
     k=k>>1;
     c[j]=k|1;
     j--;
 }

 puts("number is");
 puts(c);

3 个答案:

答案 0 :(得分:2)

除了@SouravGhosh注意到的问题,你需要

(5)通过添加字符'0'的值[实际Sourav也注意到],将数字0/1转换为'1''0'的字符值,和

(6)在将k右移1位之前选择低位

这是一个有效的版本:

char c[40];
int j=39;
c[j--]='\0';
while(k)
    {
    c[j]=(k&1)+'0';
    j--;
    k=k>>1;
    }

puts("number is ");
puts(&c[j+1]);

答案 1 :(得分:1)

我假设你想要二进制文件的词典表示法。

你需要处理好一些事情。

  1. 必须在使用前初始化k。询问用户输入(或“硬编码”,如我们所说)k的值。

  2. 如果要将数组c用作字符串,则需要对其进行空终止。

  3. 您需要使用值&执行1才能取出最后一位。添加'0'(请记住,词典)。存储它。

  4. 当前的数组索引会让您遇到麻烦。从j开始,您可以使用0的常规数组索引。在循环之后,您需要空终止最后一个索引,然后去打印。

  5. 伪代码看起来像

    #include <stdio.h>
    
    int main(void) {
    
        int val = 16;
        char  bin [128] = {0};
        int index = 0;
    
        while(val)
        {
            bin[index] = '0' + (val&1u);
            val = val >> 1;
            index++;
        }
        bin[index] = 0;
    
        puts(bin);
    
    
        return 0;
    }
    

    SEE A LIVE DEMO

    注意:您可能想要在打印之前反转字符串。

答案 2 :(得分:1)

如果有兴趣,这里的方法略有不同......

考虑到对于32位整数的图形二进制表示,您需要包含33个字节:1表示0和0,1表示字符串NULL终止符。当您遍历整数值的任何32位表示时,您可以使用输入整数值的每个位位置逻辑和(&)2 ^ 32(2147483648)的相应位来确定该位置是否应该是a&#34; 1&#34;或者&#34; 0&#34;,堆叠10的结果字符( ASCII )表示( 48或49)当你走,成一个字符串。

以下是将整数转换为32位二进制表示的示例...

const char *byte_to_binary32(long x)
{
    static char b[33]; // bits plus '\0'
    b[0] = '\0';
    char *p = b;  
    //unsigned long long z; required only if 64 bit conversion
    unsigned long z;//this is sufficient for 32 bit conversion
    for (z = 2147483648; z > 0; z >>= 1)       //2^32
    {
        *p++ = (x & z) ? '1' : '0';
    }
    return b;
}

int main(void)
{
    printf("Binary: %s\n\n", byte_to_binary32(100));
    return 0;
}