0

我不明白这个运营商。它有什么作用?

这是我在哪里找到它的示例:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
4

3 回答 3

4

这是按位或。在这种情况下,它对于组合位掩码很有用。这些标志是为设置了一个位的数字定义的,当您将它们组合在一起时,您最终会得到一个同时设置了两个位的数字。

示例:我不知道这些标志的确切值是什么,但让我们假设它们是:

#define GL_COLOR_BUFFER_BIT  0x01
#define GL_DEPTH_BUFFER_BIT  0x08

如果你用二进制写出来,你会得到:

GL_COLOR_BUFFER_BIT = 00000001
GL_DEPTH_BUFFER_BIT = 00001000

如果您将它们按位或在一起,则将输出中的位设置为 1,如果该位在GL_COLOR_BUFFER_BIT OR GL_DEPTH_BUFFER_BIT中设置,则:

GL_COLOR_BUFFER_BIT = 00000001
GL_DEPTH_BUFFER_BIT = 00001000
                    = 00001001

所以你最终得到数字 0x09。

您正在调用的函数将检查您传入的数字,并根据设置的位,它知道您传入的标志。

于 2013-02-24T13:28:07.920 回答
0

它是按位或运算符。按位或以如下所示的方式工作:

假设您有 2 个字节 a,b。

a = 0 0 1 1 0 1 0 1

b = 1 0 1 1 0 0 0 0

位运算符适用于bit level. 发生的情况是它依次获取每个位并对其执行或操作。如果至少一个(或两个)位为 1,则结果字节中的相应位也将为 1。如果它们都为 0,则结​​果位也将为 0。

所以按位或在 a 和 b 上会这样做:

a = 0 0 1 1 0 1 0 1

b = 1 0 1 1 0 0 0 0

c = 1 0 1 1 0 1 0 1

第一位 0 和 1。有一个 1,因此 c 中的位将为 1。第二位 0 和 0,因此下一个结果位将为 0。第三位均为 1。至少存在一个 1,因此 c 中的下一位将是 1...,依此类推。

希望它为你清除它。

PS。我在这里使用了虚拟位,它们绝不与GL_COLOR_BUFFER_BITor使用的实际值相对应GL_DEPTH_BUFFER_BIT

大多数按位运算符用于对值强制使用掩码或将两个值组合在一起。

|将两者结合在一起 &将强制使用掩码

让我们假设你被赋予了一个值并且你想让它看起来像这样(我们将使用它&来强制执行该掩码)。

0 0 0 1 1 1 1 0

0 对应于不应有值的位置,1 对应于您感兴趣并想要提取的位。

   a = 1 0 1 0 0 1 1 0
mask = 0 0 0 1 1 1 1 0

现在 a 中高于 0 的所有位都将被丢弃,结果在这些位中将有 0,因为 for 和 & 您需要两个位都为 1 才能产生位 1。

如果掩码中有 1,则结果中可能会出现 1。因此,在每一位上使用 & 最终都会得到这个值。

result = 0 0 0 0 0 1 1 0

如果您仔细观察,结果中与掩码中的 1 位于相同位置的 4 位只是从 a 中移动。所以它真正做的是删除掩码为 0 的位并保留为 1 的位。

于 2013-02-24T13:33:07.803 回答
0

这在一定程度上取决于您使用的语言,但在许多情况下,这是按位或. 这通常用于将几个编码为位的标志传递给函数。例如,如果您有两个标志

const char FLAG_1 = 0x01;
const char FLAG_2 = 0x02;

然后FLAG_1 | FLAG_20x03。对于按位不相交的位,这相当于加法,起初可能会令人困惑。在通话中,位是 or'd

func( FLAG_1 | FLAG_2) // set both FLAG_1 and FLAG_2

然后,该函数func可以使用按位和分别测试位:

void func( char flags ) {
     if( flag & FLAG_1 ) { // test for FLAG_1
     }
     if( flag & FLAG_1 ) { // test for FLAG_2
     }
}
于 2013-02-24T13:41:09.580 回答