c++ variable ¿Cómo funcionan las banderas en C?




variable bandera (4)

Recientemente me he encontrado con varios ejemplos de "indicadores" en C y C ++, y no entiendo muy bien cómo funcionan. Después de mirar un código fuente, noté que a menudo los valores de bandera se definen en hexadecimal, como el siguiente:

FLAG1 = 0x00000001,
FLAG2 = 0x00000010,

Mi intuición sugiere que estos valores se combinan. ¿Las banderas funcionan combinando todos los valores de indicadores en un int? Si hubiera usado ambos como FLAG1 | FLAG2 FLAG1 | FLAG2 ¿el resultado sería 0x00000011 ?

¿Necesito crear enumeraciones con compensaciones de bits o puedo usar números enteros ascendentes como:

FLAG1 = 1;
FLAG2 = 2;

Su primer método no es usar los bits de la manera más eficiente. En el primer ejemplo estás usando notación hexadecimal y es equivalente a:

TEXTUREFLAGS_POINTSAMPLE = 1,
TEXTUREFLAGS_TRILINEAR = 16,

En el segundo método, parece que solo está aumentando en uno cada vez. Esto no funcionará cuando combine banderas, porque el valor combinado podría ser el mismo que el de otra bandera (por ejemplo, 1 | 2 == 3).

Deberías usar estos valores en su lugar:

0x00000001  // == 1
0x00000002  // == 2
0x00000004  // == 4
0x00000008  // == 8
0x00000010  // == 16
0x00000020  // == 32
0x00000040  // == 64
etc...

Estos son los poderes de dos y se pueden combinar utilizando bitwise o de cualquier forma sin dar colisiones.


Necesita compensar los bits; de lo contrario, no hay forma de extraer los indicadores individuales. Si tuviera banderas correspondientes a 1, 2, 3 y 4, y un valor combinado de 5, ¿cómo podría decir si eran 2 y 3 o 1 y 4?

También puede hacerlo de esta manera, por ejemplo:

enum {
    FIRST = 1 << 0, // same as 1
    SECOND = 1 << 1, // same as 2, binary 10
    THIRD = 1 << 2, // same as 4, binary 100
    FOURTH = 1 << 3 // same as 8, binary 1000
};

Luego combinas banderas como estas:

int flags = FIRST | THIRD | FOURTH;

Y los extraes así:

if (flags & THIRD) { ...

Piense en las banderas como una matriz de 32 bits (booleanos)

Para convertir uno de estos bits en usted O con 1 << BitIndex (donde BitIndex es cero, entonces 0 - 31) Para desactivar uno usted Y con ~ (1 << BitIndex) Para comprobar si está activado o desactivado tú Y con (1 << BitIndex)

Una vez que supere la diferencia entre O / Y digital y O / Y lógico, todo hará clic. ¡Entonces apreciarás la notación hexadecimal!


Los indicadores como este son valores binarios, por lo que puede combinar 1, 2, 4, 8, 16, 32, 64, 128 en un solo byte, o más potencias de 2 hasta 2 ^ 31 en un int. Debido a que son valores binarios, puede "juntarlos", por lo que si "o" juntos 1,2,4 termina con 7, por ejemplo. Y puedes extraer el bit que quieras usando "y" - así que si tienes un int con algunas banderas o 'juntas', y quieres ver si está configurado el bit "4", puedes decir if (flag & 4) y será cierto si el bit "4" está configurado.





flags