2013-02-24 138 views

回答

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_BITORGL_DEPTH_BUFFER_BIT,所以设置:

GL_COLOR_BUFFER_BIT = 00000001 
GL_DEPTH_BUFFER_BIT = 00001000 
        = 00001001 

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

你打电话给你检查通过了号码的功能,并在此基础上位设置,它知道你传递什么标志。

+0

你能在更详细一点解释究竟是什么意思? – user2101672 2013-02-24 13:28:52

+0

感谢您的解释! – user2101672 2013-02-24 13:34:35

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_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 

现在在所有位都高于0将被丢弃,结果将在这些位0,因为和&你需要两个位是1秒,以导致位1

在哪里你的掩码中有1,这就是结果中可能出现1的地方。因此,在每个位上使用&时,您最终会得到此值。

result = 0 0 0 0 0 1 1 0 

如果你仔细看看结果中的4位,它们与掩码中的1s位置相同,只是从a中移出。所以它真的做了什么,删除了掩码有0的位,并用1保留。

0

这取决于你正在使用的语言,但在很多这是bitwise or。这通常用于将几个编码为一位的标志传递给一个函数。例如,如果你有两个标志

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

然后FLAG_1 | FLAG_20x03。对于按位不相交的位,这相当于加法,起初可能会造成混淆。在通话中的位进行逻辑或运算

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

功能func然后可以单独使用bitwise and测试位:

void func(char flags) { 
    if(flag & FLAG_1) { // test for FLAG_1 
    } 
    if(flag & FLAG_1) { // test for FLAG_2 
    } 
}