2014-11-14 59 views
6

这让我很沮丧如下代码:按位运算的结果和布尔

bool a = 0x00000FF0 & 0x00000FF0 == 0x00000FF0; 
if (a) { 
    Serial.println("True"); 
} else { 
    Serial.println("False"); 
} 

这将打印“假”。我真的不明白为什么。 一些测试:

bool a = 0x00000FF0 & 0x00000FF0 == 0x00000FF0; 
Serial.println(a); 

打印0

和:

unsigned long a = 0x00000FF0 & 0x00000FF0; 
Serial.println(a, HEX); 

打印FF0

+1

你为什么要这么做?当然只是设置一个=真? – theonlygusti 2014-11-14 17:20:05

+0

呃......这就是我困惑的事情,它是更大代码的一部分 – Rustam 2014-11-14 17:23:06

回答

8

运算符优先级,编译警告:

warning: suggest parentheses around comparison in operand of ‘&’ [-Wparentheses] 

更改为

bool a = (0x00000FF0 & 0x00000FF0) == 0x00000FF0; 
+1

Aarrgh!谢谢! – Rustam 2014-11-14 17:21:58

7

望着operator precedence,这解析为

0x00000FF0 & (0x00000FF0 == 0x00000FF0) 

当你想

(0x00000FF0 & 0x00000FF0) == 0x00000FF0 

添加圆括号,你应该得到预期的结果。

+0

+1非常感谢! – Rustam 2014-11-14 17:22:40

+0

最好的回答,非常简单和解释性! – theonlygusti 2014-11-14 17:23:42

5

这是一个简单的优先事项。

从事物的声音中,您假设:0x00000FF0 & 0x00000FF0 == 0x00000FF0;将被视为:(0x00000FF0 & 0x00000FF0) == 0x00000FF0;,但实际上它与0x00000FF0 & (0x00000FF0 == 0x00000FF0);相同。

后者既然如此,结果显然是false-- ==或者产生01,并且0xff0 & 10xff0 & 0或两个0