检查位掩码:x & b != 0 VS x & b == b

Checking bitmask: x & b != 0 VS x & b == b

假设x是位掩码值,b是一个标志,例如

x = 0b10101101
b = 0b00000100

x中检查b所指示的位是否打开似乎有两种方法:

if (x & b != 0)    // (1)
if (x & b == b)    // (2)

在大多数情况下,这两个检查似乎总是产生相同的结果,因为 b 始终是只有一位打开的二进制文件。

但是我想知道是否有任何例外情况使一种方法比另一种方法更好?

一般来说,如果我们将两个值解释为位 sets,第一个条件检查 x 和 b 的交集是否不为空(或者,换句话说:如果b 和 x 有共同的元素),而第二个检查 b 是否是 x 的子集。

显然,如果 b 是单例,当且仅当交集不为空时,b 是 x 的子集。

因此,当您不能 100% 保证 b 是单例时,请明智地选择您的条件。问问自己是否要表达 b 的所有元素也必须是 x 的元素,或者 b 的某些元素也是 x 的元素。这是一个巨大的差异 except 对于单个位的情况。