检查位掩码: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 对于单个位的情况。
假设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 对于单个位的情况。