Istnieje zmienna, która zawiera kilka flag i chcę usunąć jedną z nich. Ale nie wiem, jak to usunąć.
Oto jak ustawiłem flagę.
my.emask |= ENABLE_SHOOT;
Istnieje zmienna, która zawiera kilka flag i chcę usunąć jedną z nich. Ale nie wiem, jak to usunąć.
Oto jak ustawiłem flagę.
my.emask |= ENABLE_SHOOT;
Odpowiedzi:
Krótka odpowiedź
Chcesz wykonać operację Bitwise AND na bieżącej wartości z operacją Bitwise NOT flagi, którą chcesz cofnąć . Bitowe NIE odwraca każdego bitu (tj. 0 => 1, 1 => 0).
flags = flags & ~MASK;
lub flags &= ~MASK;
.
Długa odpowiedź
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
Kiedy wykonujesz Bitwise AND z Bitwise NOT wartości, którą chcesz cofnąć.
value = value & ~ENABLE_SHOOT // 00000001
faktycznie robisz:
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);
aby wyczyścić kilka flag:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Należy zauważyć, że jeśli przetwarzana zmienna jest większa niż liczba int, wartość użyta w wyrażeniu „and not” również musi być. Właściwie czasami można uciec od używania mniejszych typów, ale jest wystarczająco dużo dziwnych przypadków, że prawdopodobnie najlepiej jest użyć sufiksów typów, aby upewnić się, że stałe są wystarczająco duże.
flags -= flags & MY_FLAG;
(lub ^=
jeśli wolisz).