반응형
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
설정 해제할 값의 Bitwise AND를 사용하여 Bitwise 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' 식에서 사용되는 값도 같아야 합니다.실제로 작은 타입을 사용하는 것은 피할 수 있지만, 상수가 충분히 큰지 확인하기 위해 타입 접미사를 사용하는 것이 가장 좋은 경우는 충분히 있습니다.
언급URL : https://stackoverflow.com/questions/3920307/how-can-i-remove-a-flag-in-c
반응형
'programing' 카테고리의 다른 글
매개 변수를 사용하여 기본 매개 변수 없는 생성자를 생성할 때 해당 생성자가 사라지는 이유는 무엇입니까? (0) | 2022.05.30 |
---|---|
VueJS 컴포넌트에서 윈도 스크롤이벤트를 듣는 방법 (0) | 2022.05.30 |
AM/PM과 함께 현재 시간을 12시간 형식으로 표시 (0) | 2022.05.30 |
vue 구성 요소 데이터 내의 어레이를 업데이트하는 중 (0) | 2022.05.30 |
Null 포인터에 주소 0이 사용되는 이유는 무엇입니까? (0) | 2022.05.30 |