일부 플래그를 보유하는 변수가 있으며 그중 하나를 제거하고 싶습니다. 그러나 그것을 제거하는 방법을 모르겠습니다.
다음은 플래그를 설정하는 방법입니다.
my.emask |= ENABLE_SHOOT;
답변
짧은 답변
설정을 해제하려는 플래그 의 비트 단위 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)
답변
my.emask &= ~(ENABLE_SHOOT);
몇 가지 플래그를 지우려면 :
my.emask &= ~(ENABLE_SHOOT|SOME_OTHER|ONE_MORE);
답변
조작되는 변수가 int보다 큰 경우 ‘and not’표현식에 사용 된 값도 같아야합니다. 실제로, 때로는 더 작은 유형을 사용하여 벗어날 수 있지만 상수가 충분히 큰지 확인하기 위해 유형 접미사를 사용하는 것이 가장 좋은 이상한 경우가 있습니다.