【问题标题】:Strange operators "|="奇怪的运算符“|=”
【发布时间】:2011-05-18 10:50:46
【问题描述】:

我对编码比较陌生,无论如何我在复制 iphone 像素技术的教程时遇到了这个 if 语句,无论如何我不确定它在做什么,如果有人可以为我解释它会很棒谢谢。

for(int j = 0; j < (width * height); j++ ) 
{
    if ( pixels[j] & 0xff000000 )  
    {
        collisionMap[j] |= 1;
    }
}

让我感到困惑的部分是“|=”和单个“&”符号。这里发生了什么?谢谢

【问题讨论】:

  • 请将此标记为 C++。由于 for 循环中的变量声明,这不会在 C 中编译。
  • @Lundin:它将使用任何符合 C99 的编译器进行编译,甚至可以在没有 -ansi-std=c89 选项的情况下使用 C99 之前的 gcc 进行编译。
  • @Jan Ah dang it,你是对的,我忘记了 C99 允许它。谢谢指正。
  • 这是可以理解的——它只存在了 12 年,所以它在 C 进化时间尺度上是一个相当新的东西:)

标签: c++ c operators


【解决方案1】:

& 是bitwise AND.

|= 是一个bitwise OR,并将值分配给collisionMap[j]

【讨论】:

  • 也就是说“collisionMap[j] |= 1;”等同于“collisionMap[j] = collisionMap[j] | 1;”
【解决方案2】:

他们被称为bitwise operators

collisionMap[j] |= 1 等价于collisionMap[j] = collisionMap[j] | 1

这将确保设置 collisionMap[j] 的 LSB

【讨论】:

    【解决方案3】:

    |= 对任一侧的值执行按位或(考虑优先级),将结果放入左侧变量中。因此,a |= ba = a | b 相同(假设没有 C++ 运算符重载)。更具体地说,说:

    a is 01010000 binary, and
    b is 10011001 binary, then after `a |= b`...
    a is 11011001.
    

    &amp; 执行按位与运算,得到一个值,其中只有两边值的位。

    【讨论】:

    • 嗯嗯好的,谢谢大家,我现在明白了,你们帮了大忙。
    【解决方案4】:

    单个 & 执行按位与,而 |= 运算符执行按位或。

    【讨论】:

    • 严格来说:| 是按位或,|= 是按位或赋值
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2012-02-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多