理解C位宏

时间:2015-09-14 00:52:30

标签: c bitmap macros

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

#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

3 个答案:

答案 0 :(得分:1)

|=运算符执行就地按位OR。由于您只移位了一个位,因此结果中只会修改一位。剩下的价值将保持不变。

xy是图片地址。 x除以8得到一个字节地址,然后由8取模数来处理位地址。

答案 1 :(得分:0)

掩码由(0x80 >>((x)%8))构成。如您所知,它会0b10000000向右移x % 8。该字节由数组访问中的(x)/8选择,然后由掩码选择该位。

|=是一个扩充赋值操作,它设置了一个位,因为如果该位置的位在任一操作数中设置,则按位OR运算在结果位置返回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在评论中指出的那样,任何使用它的程序都应该只在无符号整数上使用它(因为有符号整数的实现会以一些有趣的方式影响你的结果),并且应该检查CHAR_BIT是8。

答案 2 :(得分:0)

a |= b只是a = a | b的简写...鉴于此而且|是C中的“按位运算符”,应该能够弄清楚发生了什么。如果不只是一个提示:“按位”操作符将对任何单个bin执行它的操作(而不是整个值)...所以0|1将是1,但是,{ {1}}将10 | 1