【问题标题】:Unexpected results from bitwise operation why (1 | 1 & 2) gives 1 instead of 2?按位运算的意外结果为什么 (1 | 1 & 2) 给出 1 而不是 2?
【发布时间】:2014-04-06 21:09:50
【问题描述】:

无法使用 Visual Studio 2010 直接进行这个简单的计算

std::cout<<(1 | 1 & 2);    

//gives the value 1, was expecting 2 since 1 | 1 = 2 , the & 2   gives 2


std::cout<<( (1 | 1) & 2); 

//gives the value 0, why is this different from above?

【问题讨论】:

标签: c++ c visual-c++


【解决方案1】:

第一种情况:

1 & 2 // 因为&amp; 的优先级高于|

 01
&10
----
 00

并将结果与​​ 1 相或,

   1
OR 0
-----
   1

第二种情况

1 | 1

   01
OR 01
----
   01

和结果与2,

   01
&  10
-----
   0

【讨论】:

    【解决方案2】:

    这仅仅是因为&amp; 运算符的优先级高于| 运算符所以

    1 | 1 & 2
    

    被评估为

    1 | (1 & 2)
    

    所以

    1 & 2 = 0
    

    1 | 0 = 1
    

    因此你的答案。

    【讨论】:

      【解决方案3】:

      1 | 1 是 1。为什么你认为应该是 2?

      1 &amp; 2 是二进制的 01 和 10,即 00 - 因此你得到的为零。

      【讨论】:

        【解决方案4】:

        这里发生了两件事:

        1. 按位与 (&amp;) 比按位或 (|) 具有更高的优先级(即首先被有效计算)。

        2. 1 | 11,而不是 2

        【讨论】:

          【解决方案5】:

          1 | 1 给 1 x | x总是会给你x

          1 | & 2 等价于 1 | (1 & 2)

          因为 & 就像 * 代表 + http://en.wikipedia.org/wiki/Operators_in_C_and_C%2B%2B#Operator_precedence

          附:这是一个在线计算器 http://www.miniwebtool.com/bitwise-calculator/?data_type=10&number1=1&number2=1&operator=OR

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-01-09
            • 2022-06-27
            • 1970-01-01
            • 1970-01-01
            • 2011-05-12
            • 1970-01-01
            • 2017-07-10
            • 1970-01-01
            相关资源
            最近更新 更多