【问题标题】:Understand C bit macros了解 C 位宏
【发布时间】:2015-09-14 00:52:29
【问题描述】:

Practical C book 中有一节是关于位图和设置/测试位的。这是设置位的示例。

#define SET_BIT(x,y) graphics[(x)/8][y] |= (0x80 >>((x)%8))

现在,我明白这一点,直到“|=”该操作如何“设置”位?它将 SET_BIT(x) 的输入与掩码进行比较,我想,这个掩码是从哪里来的?

0x80>>从最左边(10000000)开始移位,多远取决于(x)%8的结果,之所以是“%8”是因为字节“x”中有8位.我理解正确吗?

这是练习 11-1 的完整代码,其中包括 TEST_BIT 和 CLEAR_BIT 宏。 exercise 11-1

【问题讨论】:

  • 不要在有符号整数上使用它!它可能不会产生预期的结果。一个字节是否有 8 位取决于实现。你应该先检查CHAR_BIT

标签: c bitmap macros


【解决方案1】:

|= 运算符执行就地按位或。由于您只移动一位,因此结果中只会修改一位。其余的值将保持不变。

xy 是图像地址。 x 除以 8 得到字节地址,然后以 8 为模处理位地址。

【讨论】:

    【解决方案2】:

    a |= b 只是 a = a | b 的简写...鉴于 | 是 C 中的“按位 or 运算符”,您应该能够弄清楚这是怎么回事。如果不仅仅是一个提示:“按位”运算符将在任何单个 bin 上执行它的操作(而不是在整个值上)......所以0|1 将是 1,而且,10 | 1 将是11.

    【讨论】:

      【解决方案3】:

      掩码由(0x80 >>((x)%8)) 构造。正如您所注意到的,它将0b10000000 右移x % 8。字节由(x)/8在数组访问中选择,然后位由掩码选择。

      |= 是一个增强赋值操作,它设置一个位,因为如果在结果位置的位在任一操作数中设置,按位或运算在结果位置返回 1,并且标志保证对于我们的位想设置。 例如,10000000 | 0000100010001000

      注意foo |= bar; 等价于foo = foo | bar;

      更多示例:

      • SET_BIT(5,1) 会给graphics[0][1] |= 4;(4 是0b00000100
      • SET_BIT(21,1) 将给出 graphics[2][1] |= 4;(4 是 0b00000100,但我们在这里操作的是不同的字节)

      正如 Olaf 在 cmets 中指出的那样,任何使用它的程序都应该只在无符号整数上使用它(因为有符号整数的实现可能会以一些有趣的方式影响您的结果),并且应该检查 CHAR_BIT 是否为 8 .

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-10-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多