C 中的位操作和标志测试
Bit manipulation and Flags testing in C
假设我有两个类型为 int
、a
和 b
的变量,以及一个标志 F
。
#define F <something>
int a = <something> ;
int b = <something> ;
有什么简单的方法来测试 a
和 b
都有标志 F
,或者其中 none 有标志?
为了测试他们是否都拥有它,我可以使用类似的东西:
if ( a & b & F )
要测试他们中的 none 是否有,我可以使用类似的东西:
if ( !((a & F) || (b & F)) )
整个测试变成:
if ( (a & b & F) && !((a & F) || (b & F)) )
但这看起来太长太复杂了。有没有更简单的解决方案?
"none of them has it"的测试可以是
!((a | b) & F)
合并标志,屏蔽并翻转逻辑。
整个测试都可以用异或来写。 (感谢 Martin James 的想法)
!((a ^ b) & F)
这意味着"not (exactly one of a
or b
has F
)"
您正在寻找位相等性,可以通过应用 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
}
也许是这个
!((a & F) ^ (b & F))
假设我有两个类型为 int
、a
和 b
的变量,以及一个标志 F
。
#define F <something>
int a = <something> ;
int b = <something> ;
有什么简单的方法来测试 a
和 b
都有标志 F
,或者其中 none 有标志?
为了测试他们是否都拥有它,我可以使用类似的东西:
if ( a & b & F )
要测试他们中的 none 是否有,我可以使用类似的东西:
if ( !((a & F) || (b & F)) )
整个测试变成:
if ( (a & b & F) && !((a & F) || (b & F)) )
但这看起来太长太复杂了。有没有更简单的解决方案?
"none of them has it"的测试可以是
!((a | b) & F)
合并标志,屏蔽并翻转逻辑。
整个测试都可以用异或来写。 (感谢 Martin James 的想法)
!((a ^ b) & F)
这意味着"not (exactly one of a
or b
has F
)"
您正在寻找位相等性,可以通过应用 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
}
也许是这个
!((a & F) ^ (b & F))