繁体   English   中英

“ |”运算符做什么?

[英]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_BITGL_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_20x03 对于按位不相交的位,这等效于加法,这在开始时可能会造成混淆。 在通话中,位为或

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM