C中的位操作和标志测试

时间:2017-08-19 13:02:44

标签: c bit-manipulation flags bitflags

假设我有两个类型为intab的变量,以及一个标记F

#define F <something>

int a = <something> ;
int b = <something> ;

测试ab,标记为F,或者没有一个拥有它的简单方法是什么?

为了测试他们是否都拥有它,我可以使用类似的东西:

if ( a & b & F )

为了测试他们是否都没有,我可以使用类似的东西:

if ( !((a & F) || (b & F)) )

整个测试成为:

if ( (a & b & F) &&  !((a & F) || (b & F)) )

但这看起来太长太复杂了。有没有更简单的解决方案?

3 个答案:

答案 0 :(得分:3)

“没有人拥有它”的测试可以是

!((a | b) & F)

合并标志,屏蔽并翻转逻辑。

可以使用xor编写整个测试。 (感谢Martin James的想法)

!((a ^ b) & F)

这意味着“不是ab中只有一个F}”

答案 1 :(得分:2)

您正在寻找位相等,可以通过应用XOR运算符^,反转结果和屏蔽来测试。

仅当a ^ ba的相应位不同时,

b才将位设置为1。对于相同的相同位,结果位将设置为零。

如果你反转结果,你会得到一个等位的位置:

~(a ^ b)

唯一剩下的就是用F进行掩码,并检查是否相等:

if ((~(a ^ b) & F) == F) {
    ... // All bits indicated by F are set to the same value in a and b
}

答案 2 :(得分:2)

也许这一个

!((a & F) ^ (b & F))