2014-11-14 14 views
6

Il codice che frustra me è come segue:risultato dell'operazione bit a bit e booleani

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

Questo stampa "False". Non riesco davvero a capire perché. Alcuni altri test:

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

stampe 0.

E:

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

stampe FF0.

+1

Perché avete bisogno di fare questo? Sicuramente basta impostare a = True? – theonlygusti

+0

Ehm ... Beh, questo è quello che mi ha lasciato perplesso, era una parte del codice più grande – Rustam

risposta

8

precedenza degli operatori, compilare con avvertimenti:

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

Scelgo

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

Aarrgh! Grazie! – Rustam

7

Guardando il operator precedence, questa analizza come

0x00000FF0 & (0x00000FF0 == 0x00000FF0) 

quando si desidera

(0x00000FF0 & 0x00000FF0) == 0x00000FF0 

Aggiungere le parentesi e si dovrebbe ottenere il risultato previsto.

+0

+1 Grazie mille! – Rustam

+0

La migliore risposta, molto semplice e esplicativa! – theonlygusti

5

È una semplice questione di precedenza.

Dal suono delle cose, you'are assumendo che: 0x00000FF0 & 0x00000FF0 == 0x00000FF0; saranno trattati come: (0x00000FF0 & 0x00000FF0) == 0x00000FF0;, ma in realtà è lo stesso come: 0x00000FF0 & (0x00000FF0 == 0x00000FF0);.

quest'ultimo è il caso, il risultato è ovviamente false-- == produce sia 0 o 1 e 0xff0 & 1 e 0xff0 & 0 o entrambi 0.