Є змінна, яка містить деякі прапори, і я хочу видалити один з них. Але я не знаю, як її зняти.
Ось як я встановив прапор.
my.emask |= ENABLE_SHOOT;
Є змінна, яка містить деякі прапори, і я хочу видалити один з них. Але я не знаю, як її зняти.
Ось як я встановив прапор.
my.emask |= ENABLE_SHOOT;
Відповіді:
Коротка відповідь
Ви хочете виконати побітне І операцію на поточному значенні з операцією Побітовий НЕ прапор, який ви хочете зняти . Побіт НЕ перетворює кожен біт (тобто 0 => 1, 1 => 0).
flags = flags & ~MASK;
або flags &= ~MASK;
.
Довга відповідь
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
Коли ви виконуєте побітові значення І з побітним значенням НЕ значення, яке ви хочете зняти
value = value & ~ENABLE_SHOOT // 00000001
ви насправді робите:
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);
щоб очистити кілька прапорів:
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
Важливо зауважити, що якщо змінна, якою маніпулюється, більше, ніж int, має бути також і значення, яке використовується у виразі 'and not'. Насправді іноді можна піти з використання менших типів, але є достатньо випадкових випадків, що, мабуть, найкраще використовувати суфікси типу, щоб переконатися, що константи є досить великими.
flags -= flags & MY_FLAG;
(або, ^=
якщо вам зручніше).