[英]What does the “|” operator do?
我没有这个接线员。 它有什么作用?
这是我找到它的示例:
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
如果对这些位进行按位或运算,则在GL_COLOR_BUFFER_BIT
或 GL_DEPTH_BUFFER_BIT
将该位设置为1的情况下,将输出中的位设置为1。
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
或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
FLAG_1 | FLAG_2
是0x03
。 对于按位不相交的位,这等效于加法,这在开始时可能会造成混淆。 在通话中,位为或
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
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.