在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
答案 0 :(得分:1)
|=
运算符执行就地按位OR。由于您只移位了一个位,因此结果中只会修改一位。剩下的价值将保持不变。
x
和y
是图片地址。 x
除以8得到一个字节地址,然后由8取模数来处理位地址。
答案 1 :(得分:0)
掩码由(0x80 >>((x)%8))
构成。如您所知,它会0b10000000
向右移x % 8
。该字节由数组访问中的(x)/8
选择,然后由掩码选择该位。
|=
是一个扩充赋值操作,它设置了一个位,因为如果该位置的位在任一操作数中设置,则按位OR运算在结果位置返回1,并且该标志保证为我们要设置的位。
例如,10000000 | 00001000
为10001000
请注意,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
。