按位运算的意外结果为啥 (1 | 1 & 2) 给出 1 而不是 2?

Posted

技术标签:

【中文标题】按位运算的意外结果为啥 (1 | 1 & 2) 给出 1 而不是 2?【英文标题】: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?

【问题讨论】:

1|1 不等于 2。这不是算术 见***.com/questions/3730539/bitwise-operator-predence 请查看运算符优先级。欢迎使用 ***。 @ScottMcP-MVP:当然是算术。但这不是加法,即使某些包含或的符号使用+ 符号。 【参考方案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】:

这里发生了两件事:

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

    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

【讨论】:

以上是关于按位运算的意外结果为啥 (1 | 1 & 2) 给出 1 而不是 2?的主要内容,如果未能解决你的问题,请参考以下文章

当按位运算符做同样的事情时,为啥要使用逻辑运算符?

位运算(按位与按位或异或)

位运算(按位与按位或异或)

JAVA位运算符与移位运算

按位与或异或运算

按位与或异或等运算方法