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


148

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

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

my.emask |= ENABLE_SHOOT;

6
SO 질문 "C에서 단일 비트를 어떻게 설정하고 지우고 토글합니까?"에 대한 답변이 도움이 될 수 있습니다.
schot

답변:


339

짧은 답변

설정을 해제하려는 플래그비트 단위 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)

@Aaron : 도움이되어서 기쁩니다. 처음에는 누군가가 종이에 그것을 설명하는 데 10 분이 걸릴 때까지 비트 연산을 이해하는 데 어려움을 겪었 습니다.
Dennis

1
@Dennis XOR이 이미 설정된 플래그를 제거하는 데 효과적이라고 생각했습니다. notification.sound ^= Notification.DEFAULT_SOUND;
likejudo

3
Walk를 어떻게 활성화합니까? X 이후 | 0 == X
Unikorn

@Unikorn이 지적했듯이 플래그 값을 0으로 설정하거나 시도하거나 해제하려고하면 제대로 작동하지 않습니다.
RenniePet

보행을 활성화하려면 실행을 비활성화해야합니다 (비트 1을 0으로 설정 한 상태로 유지함). ENABLE_ * 플래그를 10 진수로 생각하지 말고 2 진수로 설정하거나 해제하십시오. 그러나 도보를 명시 적으로 활성화하거나 비활성화 할 수 없습니다 .
Jacob Degeling

82
my.emask &= ~(ENABLE_SHOOT);

몇 가지 플래그를 지우려면 :

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

13

조작되는 변수가 int보다 큰 경우 'and not'표현식에 사용 된 값도 같아야합니다. 실제로, 때로는 더 작은 유형을 사용하여 벗어날 수 있지만 상수가 충분히 큰지 확인하기 위해 유형 접미사를 사용하는 것이 가장 좋은 이상한 경우가 있습니다.


5
명백한 코너 케이스를 잡기 위해 +1. 이를 피하는 한 가지 방법은 대신 flags -= flags & MY_FLAG;(또는 ^=원하는 경우) 사용하는 것입니다.
R .. GitHub 중지 지원 얼음

1
@R .. 비트를 토글하고 때로는 많은 플래그 중 어떤 플래그가 설정되어 있는지 알지 못하는 경우를 제외하고 '^ ='를 사용했을 것입니다. 가장 오른쪽의 두 비트가 0인지 확인하려면 my.emask : '0 1 0 1'입력 : '0 0 1 1'with : '^ =' '0 1 0'with : '& ~ ''0 0 0 '
헥터
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.