En última instancia, este código está comprobando si un solo bit (el indicador FCTRL) está activado en la variable uop->flags
.
Pero aquí es una explicación:
Implícitamente, el código if(X)
cheques para x son un valor "verdadero". Para enteros, 0 es el único valor "falso" y todo lo demás es "verdadero".
lo tanto, su código es equivalente a:
if (0 != (uop->flags & FCTRL))
Ahora bien, ¿qué significa eso?
El operador &
realiza una "Y a nivel de bit", lo que significa que cada bit del lado izquierdo se AND con el bit correspondiente en el lado derecho.
Así que si escribimos nuestros dos operandos en binario:
uop->flags 1010 1010 (example)
FCTRL 0100 0000
En este ejemplo, si realiza una "Y" en cada par de bits, se obtiene el resultado:
result 0000 0000
que se evalúa como falso, y de hecho en ese ejemplo, el valor uop->flags
no tiene el indicador FCTRL establecido.
Ahora aquí es otro ejemplo, donde la bandera es conjunto:
uop->flags 1110 1010 (example)
FCTRL 0100 0000
El resultado AND correspondiente:
result 0100 0000
Este resultado no es cero, por lo tanto, "verdadero", lo que provocó su if
declaración.
uop-> flags = 0x140 => ¿es verdadera la condición? – mahmood
sí porque el resultado de 0x140 y 0x040 es 0x040. – Lou
Consulte http://en.wikipedia.org/wiki/Bitwise_operation para obtener más detalles sobre las operaciones en modo bit. – Lou