十进制到二进制

dar*_*sky 14 c binary bit-manipulation decimal bitwise-operators

我有一个数字,我想在C中转换为二进制(从十进制).

我希望我的二进制文件总是以5位(小数字永远不会超过31).我已经有了一个通过分割手动完成的功能,但很难将其填充到5位.

有没有更简单的方法?也许使用按位移位?

我也想把二进制文件表示为一个 char *

Aar*_*our 19

这是一个优雅的解决方案:

void getBin(int num, char *str)
{
  *(str+5) = '\0';
  int mask = 0x10 << 1;
  while(mask >>= 1)
    *str++ = !!(mask & num) + '0';
}
Run Code Online (Sandbox Code Playgroud)

在这里,我们首先确保字符串以空字符结尾.然后,我们创建一个掩码,其中包含一个掩码(它是您期望的掩码,向左移动一次以解释while条件的第一次运行中的移位).每次循环时,掩码向右移动一个位置,然后相应的字符设置为'1'或'0'(!!确保我们添加0或1 '0').最后,当掩码中的1移出数字时,while循环结束.

要测试它,请使用以下内容:

int main()
{
  char str[6];
  getBin(10, str);
  printf("%s\n", str);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)


Sal*_*iti 15

如果你不需要前导零,你可以使用itoa(value,outputstring,base)

例如

char s[9];
itoa(10, s, 2);
printf("%s\n", s);
Run Code Online (Sandbox Code Playgroud)

将打印出来

1010
Run Code Online (Sandbox Code Playgroud)

另外,你可以写一个非常简单的功能.

void tobin5str(int value, char* output)
{
    int i;
    output[5] = '\0';
    for (i = 4; i >= 0; --i, value >>= 1)
    {
        output[i] = (value & 1) + '0';
    }
}

int main()
{
    char s[6];
    tobin5str(10, s);
    printf("%s\n", s);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

将打印出来

01010
Run Code Online (Sandbox Code Playgroud)

更通用的方法可以是一个函数,询问您要转换多少位.

void tobinstr(int value, int bitsCount, char* output)
{
    int i;
    output[bitsCount] = '\0';
    for (i = bitsCount - 1; i >= 0; --i, value >>= 1)
    {
        output[i] = (value & 1) + '0';
    }
}
Run Code Online (Sandbox Code Playgroud)

当然bitsCount必须是1到32之间的值,并且缓冲区字符串必须至少分配bitsCount + 1个字符.

  • itoa()没有在标准C中定义? (6认同)