uso - ¿Cómo puedo eliminar una bandera en C?
uso de flags (3)
Es importante tener en cuenta que si la variable que se está manipulando es más grande que un int, el valor utilizado en la expresión ''y no'' también debe serlo. En realidad, a veces se puede salirse con la suya con el uso de tipos más pequeños, pero hay suficientes casos extraños de que probablemente sea mejor usar sufijos de tipo para asegurarse de que las constantes sean lo suficientemente grandes.
Hay una variable que contiene algunas banderas y quiero eliminar una de ellas. Pero no sé cómo eliminarlo.
Aquí es cómo configuro la bandera.
my.emask |= ENABLE_SHOOT;
Respuesta corta
Desea realizar una operación Y de Bit a bit en el valor actual con una operación NOT a Nivel de Bit del indicador que desea desactivar . A Bitwise NOT invierte todos los bits (es decir, 0 => 1, 1 => 0).
flags = flags & ~MASK;
o flags &= ~MASK;
.
Respuesta larga
ENABLE_WALK = 0 // 00000000
ENABLE_RUN = 1 // 00000001
ENABLE_SHOOT = 2 // 00000010
ENABLE_SHOOTRUN = 3 // 00000011
value = ENABLE_RUN // 00000001
value |= ENABLE_SHOOT // 00000011 or same as ENABLE_SHOOTRUN
Cuando ejecuta Bitwise AND con Bitwise NOT del valor que desea desactivar.
value = value & ~ENABLE_SHOOT // 00000001
en realidad lo estás haciendo:
0 0 0 0 0 0 1 1 (current value)
& 1 1 1 1 1 1 0 1 (~ENABLE_SHOOT)
---------------
0 0 0 0 0 0 0 1 (result)
my.emask &= ~(ENABLE_SHOOT);
para borrar algunas banderas:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);