c - 4位十进制到16位二进制转换码

标签 c pointers bit-manipulation

#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=12mask=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/

相关文章:

c - float 学(5/3 * 2)给出错误的结果

c - 我应该如何用指针算术来解决这个密码?

c - 正在重新分配的指针未分配

c++ - 无符号到有符号的转换,位级别会发生什么?

c - 关于交换位的问题

c++ - 在 C++ 中将 64 位值左移 64 位给出奇怪的结果

c - 读取图像

c - C语言中如何比较多个字符串

比较数字与特殊字符

c++ - 混淆段错误