【问题标题】:What does the "|" operator do?“|”是什么意思运营商呢?
【发布时间】:2013-02-24 13:26:43
【问题描述】:

我不明白这个运算符。它有什么作用?

这是我找到它的示例:

glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);

【问题讨论】:

    标签: methods syntax operators operator-keyword


    【解决方案1】:

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

    示例: 我不知道这些标志的确切值是什么,但让我们想象一下它们是:

    #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 OR GL_DEPTH_BUFFER_BIT 中设置,则将输出中的位设置为 1,所以:

    GL_COLOR_BUFFER_BIT = 00000001
    GL_DEPTH_BUFFER_BIT = 00001000
                        = 00001001
    

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

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

    【讨论】:

    • 你能更详细地解释一下你的意思吗?
    • 感谢您的解释!
    【解决方案2】:

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

    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 然后可以使用bitwise and 单独测试位:

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

    【讨论】:

      【解决方案3】:

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

      假设您有 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 的位。

      【讨论】:

        猜你喜欢
        • 2010-10-24
        • 2023-03-04
        • 2017-07-14
        • 1970-01-01
        • 1970-01-01
        • 2011-11-19
        • 2018-01-11
        • 2013-07-15
        • 2016-04-01
        相关资源
        最近更新 更多