如果我想将值的第2位设置为0
,则以下两者之间有什么区别:
value = value & (1<<2);
value = value & 0x2;
答案 0 :(得分:4)
使用按位AND时,清除掩码中未设置的所有位。所以你实际上只保留了一点。如果您只想清除一个,请将所有位设置为1 ,除了您想要的位。您可以使用~
运算符反转掩码中的所有位,如下所示:
value = value & ~(1<<2);
value = value & ~(0x2);
那就是说,这两个陈述明确不同。在第一种情况下,1<<2
评估为4,即00000100
或0x04
。在第二种情况下,0x2
是00000010
。他们的反转分别为11111011
和11111101
。
答案 1 :(得分:1)
正式回答
严格地说,如果您正在使用LSB,那么首先形成value = value & (1<<2);
,它等于(伪,或使用GNU扩展,允许二进制常量的代码)value = value & 0b100;
将设置到0
除第2位以外的所有位,第二种形式value = value & 0x2;
(或value = value & 0b10;
)将设为0
除位以外的所有位1 即可。所以最后第二种形式会做你想要的 - 设置为0
第2位(连同许多其他位,但是谁在乎我们是否完全按照它的方式提出你的问题?)。
请注意,如果您处于MSB世界,则两者都将设置为0
位2
非正式回答
如果,尽管你怎么说问题,你实际上想知道使用移位操作的常量表达式与常量字面值之间是否存在差异然后答案为否,没有区别 - 编译器将评估expression (1<<2)
在编译时为4
在dbush的回答中描述了如何正确地将一位设置为0