Istnieje zmienna przechowująca niektóre flagi i chcę usunąć jedną z nich. Ale nie wiem, jak to usunąć.Jak mogę usunąć flagę w C?
Oto jak ustawić flagę.
my.emask |= ENABLE_SHOOT;
Istnieje zmienna przechowująca niektóre flagi i chcę usunąć jedną z nich. Ale nie wiem, jak to usunąć.Jak mogę usunąć flagę w C?
Oto jak ustawić flagę.
my.emask |= ENABLE_SHOOT;
Krótka odpowiedź
Chcesz zrobić operację Bitwise AND od bieżącej wartości z Bitwise NOT pracy flagi chcesz usunąć ustawienie. Bitowe NOT nie odwraca każdego bitu (tzn. 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
podczas wykonywania bitowe I z bitowe nie stanowi wartości chcesz rozbrojony.
value = value & ~ENABLE_SHOOT // 00000001
jesteś rzeczywiście robi:
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)
@Aaron: Cieszę się, że pomogło. Początkowo miałem problemy z rozumieniem operacji bitowych *, aż * ktoś poświęcił 10 minut na wyjaśnienie tego na papierze. – Dennis
@Dennis Myślałem, że XOR będzie działać, aby usunąć już ustawioną flagę. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu
Jak włączyć Walk? Od X | 0 == X – Unikorn
my.emask &= ~(ENABLE_SHOOT);
aby usunąć kilka flagi:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Ważne jest, aby pamiętać, że jeśli zmienna jest manipulowany jest większy niż int, wartość używana w „NIE I” wyrażenia musi być tak dobrze. Właściwie można czasem uciec z użyciem mniejszych typów, ale jest wystarczająco dużo dziwnych przypadków, że najlepiej jest użyć sufiksów typu, aby upewnić się, że stałe są wystarczająco duże.
+1 za uchwycenie nieoczywistego przypadku narożnika. Jednym ze sposobów uniknięcia tego jest użycie 'flags - = flags & MY_FLAG;' (lub '^ =' jeśli wolisz). –
@R .. Użyłbym '^ =', z wyjątkiem tego, że przełącza bity, a czasami możesz nie wiedzieć, która z wielu flag jest ustawiona. Jeśli chcę się upewnić, że dwa najbardziej prawe bity to zero, to na przykład my.emask: '0 1 0 1' wkład: '0 0 1 1' z: '^ =' '0 1 1 0' z: 'i ~ '0 1 0 0' – Hector
Możesz znaleźć odpowiedzi na pytanie SO ["Jak ustawić, wyczyścić i przełączyć jeden bit w C"] (http://stackoverflow.com/questions/47981/how-do-you-set- jasne i przełączyć-pojedyncze-bit-do-c) pomocne. – schot