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个字符.