Ver Mensaje Individual
  #4 (permalink)  
Antiguo 27/01/2015, 01:47
eferion
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 10 años, 1 mes
Puntos: 204
Respuesta: Uint32 flags - SDL

Se que el tema ya está solucionado. Sin embargo, por si vuelves a pasar por aquí, te cuento un poco para que te quites el miedo a los flags.

Un flag no es más que un estado binario (1 o 0) que se almacena en una variable. Dado que una variable numérica dispone de varios bits, es posible almacenar varios flags diferentes en una misma variable. Por ejemplo, en un "unsigned int", que típicamente ocupa 4 bytes, sera posible almacenar 32 flags diferentes, uno en cada bit de la variable.

Para "setear" estos flags hay que hacer uso de lógica binaria. Un ejemplo:

Código C++:
Ver original
  1. unsigned int flags = 0;
  2.  
  3. // Activo el 3er bit
  4. flags |= 0x04 // En binario: 0000 0000 0000 0100
  5.  
  6. // Activo el 1er bit
  7. flags |= 0x01
  8.  
  9. // Desactivo el 3er bit
  10. flags ^= 0x04
  11.  
  12. printf( "%d", flags ); // Imprime 1

Usar una variable a modo de flag puede ser útil cuando quieres, o necesitas, empaquetar información de estado o configuración. Esto se suele hacer configurando un enum para evitar meter la pata con los valores:

Código C++:
Ver original
  1. enum RunConfig
  2. {
  3.   NoConfig = 0,
  4.   LoadConfig = 1<<0, // 0x01
  5.   SaveConfig = 1<<1, // 0x02
  6.   LoadData = 1<<2, // 0x04
  7.   RunServices = 1<<3, // 0x08
  8.   LogEnabled = 1<<4, // 0x10
  9.   // ...
  10. };
  11.  
  12. int flag = LoadConfig | LogEnabled; // 0x01 + 0x10 = 0x11 <-> 0001 0001
  13.  
  14. // ...
  15.  
  16. if ( flag & LogEnabled ) // 0001 0001 & 0001 0000 = 0001 0000 != 0
  17. {
  18.   // Este código se ejecutará al estar activo el 5º flag
  19. }
  20.  
  21. if ( flag & RunServices ) // 0001 0001 & 0000 1000 = 0000 0000 == 0
  22. {
  23.  // Este código no se ejecutará, el 4º flag no está activo
  24. }

Espero haberte aclarado con esto un poco el tema de los flags