#include <stdio.h>
int main()
{
char str[17];
getBin(3334, str);
printf("%s\n", str);
return 0;
}
void getBin(int num, char *str)
{
*(str+16) = '\0';
int mask = 0x8000 << 1;
while(mask >>= 1)
*str++ = !!(mask & num) + '0';
}
我不太明白 while 循环是如何工作的。有人可以简单地解释一下它在做什么吗?谢谢
最佳答案
是的,当然。所以 0x8000
= 8 * 16^3 = 2^15 。现在,如果您再向左移动一次,您将得到 2^16。
while 循环不断地对所有值进行掩码:
- 2^15
- 2^14
- 2^13 ...
因此 while 循环将 mask 视为常规整数中 2 的幂的迭代器。
现在 !!(mask & num)
做什么?如果掩码指示的位翻转on
,则返回 1;如果off
,则返回 0。
表达式 !!(mask & num)
返回 0 或 1 并添加到 0
的字符代码,它返回 0
的字符代码code> 或 1
。
例如,如果 num=12
和 mask=4
则 !!(4 & 12) = !!(100 & 1100) = !! (100)=!0 = 1
。现在,如果添加 1 + '0'
你会得到什么?您将得到 1+48=49
,这是 1
的字符代码。
*str++ = ..
将值分配给字符串中的特定位置,然后递增指针以指向下一个字符。
问题是:str
是否以 null 结尾?
我认为行 *(str+16) = '\0';
负责处理空终止,因为它预防性地设置空终止字节。
所以我想这是对您上面编写的代码段的解释。
关于c - 4位十进制到16位二进制转换码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15379245/