检查多个位是否被设置或清除

8

我希望检查一个32位寄存器中是否设置或清除了多个位,以便于操作硬件。我采用以下方法来检查所需位(第8位和第1位)的状态,这个32位无符号整数变量名为statusRegister

if ((statusRegister & 0x00000102) == 0x00000102) {}

接下来是检查所需位是否清除的代码:

if ((statusRegister | ~0x00000102) == ~0x00000102) {}

这样正确吗?有更简洁的方法来完成它吗?


5
为什么需要替代方案?尤其是第一个方案(检查位集)非常清晰易懂。第二个方案略复杂,但你可以简单地使用(statusRegister & 0x00000102) == 0来实现。 - Some programmer dude
1
现在问题已经被编辑了@Someprogrammerdude,我认为你可以把你的评论转化为一个答案:) - gsamaras
1个回答

14

要检查多个位是否已清除,通常可以使用这种更为简洁的习惯用语:

if ((statusRegister & 0x00000102) == 0) {}
// or
if (!(statusRegister & 0x00000102)) {}

你还可以使用以下方法检查多个位是否被设置:

if ((statusRegister | ~0x00000102) == ~0) {}
// or
if (!(~statusRegister & 0x00000102)) {}

但你问题中的版本更为常见。用位掩码进行与运算是最简单的思维模型,也是最容易让其他程序员理解的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接