답변:
짧은 답변
설정을 해제하려는 플래그 의 비트 단위 NOT 연산을 사용하여 현재 값에 대해 비트 단위 AND 연산 을 수행 하려고합니다 . 비트 NOT은 모든 비트를 반전시킵니다 (예 : 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
비트 단위 NOT을 사용하여 비트 단위 AND를 수행 할 때 설정 해제하려는 값입니다.
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;
조작되는 변수가 int보다 큰 경우 'and not'표현식에 사용 된 값도 같아야합니다. 실제로, 때로는 더 작은 유형을 사용하여 벗어날 수 있지만 상수가 충분히 큰지 확인하기 위해 유형 접미사를 사용하는 것이 가장 좋은 이상한 경우가 있습니다.
flags -= flags & MY_FLAG;
(또는 ^=
원하는 경우) 사용하는 것입니다.