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

store binary of decimal in char array

我想通过应用以下代码在 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);

我假设您想要二进制的字典顺序表示。

你需要处理一些事情。

  1. 必须初始化k才能使用。要求用户输入(或 "hardcode",如 我们 所说)k.

  2. 的值
  3. 如果要将数组 c 用作 string,则需要对其进行 null 终止。

  4. 需要执行&,取值为1,取出最后一位。用 '0' 添加它(记住, 词典)。存储那个。

  5. 当前的数组索引会给您带来麻烦。您可以使用 j 的普通数组索引,从 0 开始。循环结束后,需要对最后一个索引进行空终止,然后进行打印。

伪代码看起来像

#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


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

除了@SouravGhosh 指出的问题,您还需要

(5) 通过添加字符 '0' 的值,将数字 0/1 转换为 '0''1' 的字符值 [实际上 Sourav 也注意到了这一点],以及

(6) 在 将k 右移1 位之前 取出低位。

这是一个工作版本:

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

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

如果有兴趣,这里有一个稍微不同的方法...

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

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

const char *byte_to_binary32(long x)
{
    static char b[33]; // bits plus '[=10=]'
    b[0] = '[=10=]';
    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;
}