如果你只看一点,真值表由下式给出
0 | 0 == 0
0 | 1 == 1
1 | 0 == 1
1 | 1 == 1
因此,当且仅当在至少一个操作数中设置该位时,按位或设置一个位。
当您按位使用或在具有多于一位的变量上使用时,上述真值表将以按位方式应用。
所以,假设你有两个变量,它们的二进制表示是
001101
011001
当您将它们与按位或组合时,您将收集在任一变量中设置的所有位。所以结果是
011101
按位或运算符通常用于向一组位标志添加新标志。该值用于表示数学集。每个位都被分配了一个特定的含义,它与通用集的一个成员相关联。当位为 1 时,该成员包含在集合中,而当位为 0 时,关联的成员不在集合中。
所以,让我们举一个非常简单的例子,一个有两个成员的全集。让我们称变量为controlState
。位 0 表示可见属性,位 1 表示启用属性。所以,你可以像这样定义标志
const int visibleFlag = 1; // 01 in binary
const int enabledFlag = 2; // 10 in binary
然后你可以像这样构建controlState
变量:
int controlState = 0; // empty set
if (isVisible)
controlState |= visibleFlag;
if (isEnabled)
controlState |= enabledFlag;
如果您不知道是否设置了特定位,它会变得更有趣。因此,您可以确保可见位设置如下:
controlState = ...; // could set visible flag, or not ...
controlState |= visibleFlag;
controlState
是否包含标志的原始值无关紧要。在此操作之后,它将被确定设置,并且不会更改其他标志。
这就是您的代码示例中发生的事情。所以,
descriptor = limit & 0x000F0000;
初始化descriptor
. 然后
descriptor |= (flag << 8) & 0x00F0FF00;
补充道(flag << 8) & 0x00F0FF00
。等等。