2010-10-13 12 views
111

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; 
+5

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

Odpowiedz

266

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) 
+0

@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

+1

@Dennis Myślałem, że XOR będzie działać, aby usunąć już ustawioną flagę. 'notification.sound^= Notification.DEFAULT_SOUND;' – likejiujitsu

+3

Jak włączyć Walk? Od X | 0 == X – Unikorn

69
my.emask &= ~(ENABLE_SHOOT); 

aby usunąć kilka flagi:

my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE); 
10

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.

+4

+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). –

+1

@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

Powiązane problemy