按位操作的意外结果为什么(1 | 1& 2)给出1而不是2?

时间:2014-04-06 21:09:50

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

使用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?

5 个答案:

答案 0 :(得分:4)

第一种情况:

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

 01
&10
----
 00

和OR结果为1,

   1
OR 0
-----
   1

在第二种情况下

1 | 1

   01
OR 01
----
   01

和AND结果为2,

   01
&  10
-----
   0

答案 1 :(得分:2)

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

1 | 1 & 2

评估为

1 | (1 & 2)

所以

1 & 2 = 0

1 | 0 = 1

因此你的答案。

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

这里发生了两件事:

  1. 按位AND(&)具有比按位OR(|)更高的优先级(即,首先被有效评估)。

  2. 1 | 11,而不是2

答案 4 :(得分:0)

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

1 | &安培; 2相当于1 | (1&amp; 2)

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

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