tutorial scratch online from for beginners c++ bitmask

c++ - scratch - if(máscara y VALOR) o si((máscara y VALOR)== VALOR?



c++ from scratch (5)

Probablemente estés familiarizado con el esquema enum bitmask, como:

enum Flags { FLAG1 = 0x1, FLAG2 = 0x2, FLAG3 = 0x4, FLAG4 = 0x8, NO_FLAGS = 0, ALL_FLAGS = FLAG1 | FLAG2 | FLAG3 | FLAG4 }; f(FLAG2 | FLAG4);

He visto un montón de código que luego prueba un poco en la máscara como

if ((mask & FLAG3) == FLAG3)

Pero, ¿no es eso equivalente a esto?

if (mask & FLAG3)

¿Hay alguna razón para usar la primera versión? En mi opinión, la segunda versión más corta es más legible.

¿Tal vez los hábitos sobrantes de los programadores de C que piensan que los valores verdaderos deberían convertirse en 1 ? (Aunque incluso allí, la versión más larga tiene más sentido en una declaración de asignación o return que en una prueba de declaración condicional).


Cuando se trata de un conjunto de bits, por lo que debe comparar solo un bit, está bien tener if(mask & value) .

Pero, supongamos que tiene una dirección IP almacenada en ant int32 y desea saber si es 192.168.* , Entonces tendrá que hacer:

if((ip & 0xFFFF0000) == 0xC0A80000) // assuming some endianness representation.


Incluso para el valor de un solo bit donde estas declaraciones son realmente equivalentes, siempre estoy a favor de la comparación explícita.

  1. Hace la intención más clara. Realmente estamos interesados ​​en comparar banderas. (x & Flag) == Flag es un patrón establecido y puedo procesarlo y reconocerlo en un abrir y cerrar de ojos.

  2. Normalmente prefiero las conversiones explícitas a las implícitas. Hago una excepción para estados if (file.good()) (por ejemplo, escribo if (file) lugar de if (file.good()) ) pero cuando trabajo con números, 0 no es un "estado fallido", es un número como cualquier otro. No me gusta tratarlo de manera diferente en un contexto booleano.


La construcción if ((mask & FLAG3) == FLAG3) prueba si todos los bits en FLAG3 están presentes en la máscara; if (mask & FLAG3) prueba si hay alguno presente.

Si sabes que FLAG3 tiene exactamente 1 bit configurado, son equivalentes, pero si potencialmente estás definiendo condiciones compuestas, puede ser más claro adquirir el hábito de probar explícitamente todos los bits, si eso es lo que quieres decir.


Su condición será verdadera si el resultado es distinto de cero. En su ejemplo, el resultado de ambas operaciones sería equivalente, y la segunda opción podría ser incluso más rápida porque algunas CPU pueden probar cero más fácilmente que otros números arbitrarios, PERO:

Obviamente, no puede hacer la segunda opción si el valor que está buscando consta de más de un bit. En ese caso, debes usar la primera opción. Eso obviamente también se aplica si estás buscando varios bits al mismo tiempo.


if toma un booleano ( bool ). La primera expresión es directamente de tipo bool , mientras que la última es un valor numérico que se convertirá implícitamente en bool .