我不明白这个运营商。它有什么作用?
这是我在哪里找到它的示例:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
我不明白这个运营商。它有什么作用?
这是我在哪里找到它的示例:
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
这是按位或。在这种情况下,它对于组合位掩码很有用。这些标志是为设置了一个位的数字定义的,当您将它们组合在一起时,您最终会得到一个同时设置了两个位的数字。
示例:我不知道这些标志的确切值是什么,但让我们假设它们是:
#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。
您正在调用的函数将检查您传入的数字,并根据设置的位,它知道您传入的标志。
它是按位或运算符。按位或以如下所示的方式工作:
假设您有 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_BIT
or使用的实际值相对应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 的位。
这在一定程度上取决于您使用的语言,但在许多情况下,这是按位或. 这通常用于将几个编码为位的标志传递给函数。例如,如果您有两个标志
const char FLAG_1 = 0x01;
const char FLAG_2 = 0x02;
然后FLAG_1 | FLAG_2
是0x03
。对于按位不相交的位,这相当于加法,起初可能会令人困惑。在通话中,位是 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
}
}