[c] C에서 플래그를 제거하려면 어떻게해야합니까?

일부 플래그를 보유하는 변수가 있으며 그중 하나를 제거하고 싶습니다. 그러나 그것을 제거하는 방법을 모르겠습니다.

다음은 플래그를 설정하는 방법입니다.

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’표현식에 사용 된 값도 같아야합니다. 실제로, 때로는 더 작은 유형을 사용하여 벗어날 수 있지만 상수가 충분히 큰지 확인하기 위해 유형 접미사를 사용하는 것이 가장 좋은 이상한 경우가 있습니다.


답변