Hay una variable que contiene algunas banderas y quiero eliminar una de ellas. Pero no sé cómo eliminarlo.
Así es como configuro la bandera.
my.emask |= ENABLE_SHOOT;
Hay una variable que contiene algunas banderas y quiero eliminar una de ellas. Pero no sé cómo eliminarlo.
Así es como configuro la bandera.
my.emask |= ENABLE_SHOOT;
Respuestas:
Respuesta corta
Desea realizar una operación AND a nivel de bit en el valor actual con una operación NOT a nivel de bit del indicador que desea desarmar . Un bit a bit NO invierte cada bit (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 realiza un Bitwise AND con Bitwise NOT del valor que desea desarmar.
value = value & ~ENABLE_SHOOT // 00000001
en realidad 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)
notification.sound ^= Notification.DEFAULT_SOUND;
my.emask &= ~(ENABLE_SHOOT);
para borrar algunas banderas:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Es importante tener en cuenta que si la variable que se manipula es mayor que un int, el valor utilizado en la expresión 'y no' también debe serlo. En realidad, a veces uno puede salirse con la suya usando tipos más pequeños, pero hay suficientes casos extraños que probablemente sea mejor usar sufijos de tipo para asegurarse de que las constantes sean lo suficientemente grandes.
flags -= flags & MY_FLAG;
(o ^=
si lo prefiere).