2

假设我有两个类型为inta和的变量b以及一个 flag F

#define F <something>

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

有什么简单的方法来测试aand b,有 flag F,或者他们都没有?

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

if ( a & b & F )

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

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

整个测试变成:

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

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

4

3 回答 3

3

“他们都没有”的测试可以是

!((a | b) & F)

合并标志、屏蔽和翻转逻辑。


整个测试可以使用 xor 编写。(感谢马丁詹姆斯的想法)

!((a ^ b) & F)

这意味着“不是(恰好是其中之一ab具有F)”

于 2017-08-19T13:04:17.620 回答
2

也许这个

!((a & F) ^ (b & F))
于 2017-08-19T13:18:22.703 回答
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
}
于 2017-08-19T13:10:17.247 回答