假设我有两个类型为int
,a
和b
的变量,以及一个标记F
。
#define F <something>
int a = <something> ;
int b = <something> ;
测试a
和b
,标记为F
,或者没有一个拥有它的简单方法是什么?
为了测试他们是否都拥有它,我可以使用类似的东西:
if ( a & b & F )
为了测试他们是否都没有,我可以使用类似的东西:
if ( !((a & F) || (b & F)) )
整个测试成为:
if ( (a & b & F) && !((a & F) || (b & F)) )
但这看起来太长太复杂了。有没有更简单的解决方案?
答案 0 :(得分:3)
“没有人拥有它”的测试可以是
!((a | b) & F)
合并标志,屏蔽并翻转逻辑。
可以使用xor编写整个测试。 (感谢Martin James的想法)
!((a ^ b) & F)
这意味着“不是a
或b
中只有一个F
}”
答案 1 :(得分:2)
您正在寻找位相等,可以通过应用XOR运算符^
,反转结果和屏蔽来测试。
a ^ b
和a
的相应位不同时, 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))