In definitiva, questo codice controlla se un bit singolo (il flag FCTRL) è attivato nella variabile uop->flags
.
ma ecco qualche spiegazione:
Implicitamente, il codice if(X)
controlli per X è un valore "vero". Per gli interi, 0 è l'unico valore "falso" e tutto il resto è "vero".
Pertanto il codice è equivalente a:
if (0 != (uop->flags & FCTRL))
Ora, che cosa significa?
L'operatore &
esegue un "AND bit a bit", che significa che ogni bit del lato sinistro è ANDed con il bit corrispondente sul lato destro.
Quindi, se abbiamo scritto le nostre due operandi in binario:
uop->flags 1010 1010 (example)
FCTRL 0100 0000
In questo esempio, se si esegue un "AND" su ogni coppia di bit, si ottiene il risultato:
result 0000 0000
Che viene valutato come falso, e in effetti in quell'esempio il valore uop->flags
non ha il flag FCTRL impostato.
Ora ecco un altro esempio, dove la bandiera è insieme:
uop->flags 1110 1010 (example)
FCTRL 0100 0000
Il risultato AND corrispondente:
result 0100 0000
Questo risultato è diverso da zero, quindi, "vero", innescando la tua if
dichiarazione.
uop-> flags = 0x140 => la condizione è vera? – mahmood
sì perché il risultato di 0x140 e 0x040 è 0x040. – Lou
Vedere http://en.wikipedia.org/wiki/Bitwise_operation per ulteriori dettagli sulle operazioni bit a bit. – Lou