按位运算的意外结果为啥 (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 // 因为&
的优先级高于|
01
&10
----
00
并将结果与 1 相或,
1
OR 0
-----
1
第二种情况
1 | 1
01
OR 01
----
01
和结果与2,
01
& 10
-----
0
【讨论】:
【参考方案2】:这仅仅是因为&
运算符的优先级高于|
运算符所以
1 | 1 & 2
被评估为
1 | (1 & 2)
所以
1 & 2 = 0
和
1 | 0 = 1
因此你的答案。
【讨论】:
【参考方案3】:1 | 1
是 1。为什么你认为应该是 2?
1 & 2
是二进制的 01 和 10,即 00 - 因此你得到的为零。
【讨论】:
【参考方案4】:这里发生了两件事:
按位与 (&
) 比按位或 (|
) 具有更高的优先级(即首先被有效计算)。
1 | 1
是 1
,而不是 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?的主要内容,如果未能解决你的问题,请参考以下文章