1

为了我自己的爱,我无法弄清楚这段 C 代码背后的逻辑是什么。

假设下面应该打印出 unsigned char x 的二进制表示,我们只允许填写空白。

void print_binary(unsigned char x) {
    int b = 128;

    while (__________________) {

        if (b <= x) {
            x -= b;
            printf("1");
        } else
            printf("0");

        ______________________;
    }
}

当然,我可以通过简单地忽略上面的行来玩这个程序。但是,我的印象是,这并不是真正的做事方式(它更像是一种黑客行为)。

我的意思是现在,第一个条件检查 128 是否 <= 字符,但不是无符号字符,什么,255 字节?那么为什么它只在里面打印'1'。

也许我错过了一些非常明显的东西(不是真正的交流程序员),但这次逻辑并没有深入到我的脑海中。

谁能指出我正确的方向?如果你能在不完全说出答案的情况下给我一个线索,那就太棒了。

4

3 回答 3

3
void print_binary(unsigned char x) {
    int b = 128;

    while (b != 0) {

        if (b <= x) {
            x -= b;
            printf("1");
        } else
            printf("0");

        b = b >> 1;
    }
}

b 的二进制表示是10000000。通过做b >> 1和检查b <= x,我们可以检查xis1或的每一位0

于 2013-09-02T06:34:46.630 回答
1

您只需要一条线索:当前位的值总是大于其后较低有效位的组合。因此,代码尝试在每次循环迭代时仅测试最重要的“1”位。

于 2013-09-02T06:50:00.597 回答
0

如果我们忽略原始代码,最直观的方法是:

void print_binary (uint8_t x) 
{
  for(uint8_t mask=0x80; mask!=0; mask>>=1)
  {
    if(x & mask)
    {
      printf("1");
    }
    else
    {
      printf("0");
    }
  }
  printf("\n");
}
于 2013-09-02T06:28:45.343 回答