【问题标题】:What does "|=" operation mean in C++?“|=”操作在C++中是什么意思?
【发布时间】:2011-02-09 02:41:25
【问题描述】:

我有以下代码,但我不明白这是什么意思:

var1 |= var2>0 ? 1 : 2;

任何人都可以帮助我!

【问题讨论】:

  • 在 CS 中,它被称为“复合赋值”。
  • 您应该阅读该语言。
  • 仅供参考,这在给定的 Java 中也是可行的,例如int var1, var2.
  • 这被称为“某人太聪明了,创建了不可读的代码,而不是创建了易于阅读和维护的干净的逻辑结构代码”。 polygenelubricants 的答案是完美的,因为它可以立即理解。

标签: java c++ operators ternary-operator compound-assignment


【解决方案1】:

cond ? x : y 如果 cond 为真,则返回 x,否则返回 y。阅读Ternary Operator

a |= ba = a | b 的简写,将a | b 分配给a

a | bab 中的bitwise OR。 (例如 2 | 3 = 3 和 1 | 2 = 3)

【讨论】:

    【解决方案2】:

    整数可以用二进制表示,使得每个数字(位、开关)为1(开)或0(关):

    00000000  ==  0
    00000001  ==  1
    00000010  ==  2
    00000011  ==  3
    00000100  ==  4
    00001000  ==  8
    00010000  ==  16
    

    按位或通过“合并”两组位来组合两个数字:

    First number:     00110000
    Second number:    00000010
    Result:           00110010
    

    如果输入数字中有一个位为 1,则结果中的位为 1。

    与按位与比较,找到两组位的“重叠”:

    First number:     00110100
    Second number:    10011110
    Result:           00010100
    

    如果一个位在两个输入数字中都是 1,那么它在结果中将为 1。

    如果数字在变量 a 和 b 中,您可以将按位 OR/AND 结果放入新变量 c:

    unsigned int c = a | b; // OR
    
    unsigned int c = a & b; // AND
    

    通常需要将结果放入两个变量之一,即

    unsigned int c = a | b; // OR
    c = a; // copy
    

    因此,作为一种速记,您可以一步完成:

    a |= b; // merge b directly into a
    

    【讨论】:

      【解决方案3】:

      正如我之前的其他人所提到的,这意味着您最终会得到按位或的赋值。

      可以通过取左侧和右侧的位模式并将它们放在彼此的顶部来说明按位或。

      在每一列中:0 + 0 给出 0,1 + 0 给出 1,0 + 1 给出 1,1 + 1 给出 1。
      在布尔值的上下文中:false OR false == false、true OR false == true、false OR true == true、true OR true == true。

      以下是按位或的示例以及生成的位模式: var1(11) |= var2(14) --> var1(15)

      1011 (11) 或 1110 (14) = 1111 (15)

      【讨论】:

        【解决方案4】:

        所有a op= b 运算符都是a = a op b 的快捷方式。

        但是,由于 C++ 允许单独覆盖 opop=,因此您依赖自定义类型的每个实现者来保持一致。

        【讨论】:

        • 我认为任何在@@= 中执行不同任务的人都是邪恶的:s
        • @Matthieu:C++ 是(而且,IMO 将永远是)一种语言,它可以为您提供大量的绳索让您上吊。
        • 我不知道有谁将它们实现为具有不同的行为(除了复合赋值显然改变了它的左操作数)。但是实现一个而没有另一个是相当普遍的,例如iostreams 插入运算符。
        • 但要傻到把绳子系在自己的脖子上是需要付出努力的。
        • a != b;a = a ! b; 不一样!
        【解决方案5】:

        正如其他人所说,它是 v1 = v1 | v2; 的缩写 您可能会遇到的另一种用法是布尔值。
        给定:

        bool b = /*some value*/
        

        而不是说:

        if(a)
          b = true;
        

        你可能会看到:

          b |= a;
        

        【讨论】:

          【解决方案6】:

          运算符|=表示按位或运算符赋值

          【讨论】:

            【解决方案7】:
            if (var2 > 0)
              var1 = var1 | 1;
            else 
              var1 = var1 | 2;
            

            按位或。

            【讨论】:

              【解决方案8】:

              它是Assignment by bitwise OR

              v1 |= v2;
              

              是:

              v1 = v1 | v2;
              

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2011-11-21
                • 1970-01-01
                • 2015-11-22
                • 1970-01-01
                • 2013-03-09
                • 2011-07-07
                • 2018-07-31
                • 1970-01-01
                相关资源
                最近更新 更多