2014-11-14 60 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