비트 플래그
1. 비트 연산자(bit flag)
-
AND(&)
대응되는 비트가 모두 1이면 1을 다른 경우는 0을 반환한다.
-
OR(|)
대응되는 비트 중 하나라도 1이면 1을 반환한다.
-
XOR(^)
대응되는 비트가 서로 다르면 1을 반환한다.
-
NOT(~)
비트를 1이면 0으로, 0이면 1로 반전시킨다.
-
Shift Operator
쉬프트 연산자는 비트를 왼쪽 또는 오른쪽으로 한칸씩 이동시키는 기능을 한다.
비어있는 칸은 0으로 채워진다.
2. 비트연산자 활용
메모리에 0과 1로 저장되는 점을 활용해 on/off 또는 체크 등의 기능으로 사용할 수 있는 비트 플래그를 만들어 본다.
3. 튜토리얼 체크 플래그
튜토리얼을 단계별로 나누고 각 단계의 튜토리얼을 수행했는지 플래그를 사용해 체크한다.
#include <stdio.h>
enum {
Tutorial1 = 1, Tutorial2 = 2, Tutorial3 = 4, Tutorial4 = 8,
Tutorial5 = 16, Tutorial6 = 32, Tutorial7 = 64, Tutorial8 = 128
};
void SetTutorialFlag(int* _Tutorial, int TutorialNum);
void RemoveTutorialFlag(int* _Tutorial, int TutorialNum);
void CheckTutorialFlag(int* _Tutorial, int TutorialNum);
int main()
{
int TutorialF = 0;
SetTutorialFlag(&TutorialF, Tutorial1);
SetTutorialFlag(&TutorialF, Tutorial2);
SetTutorialFlag(&TutorialF, Tutorial3);
RemoveTutorialFlag(&TutorialF, Tutorial1);
RemoveTutorialFlag(&TutorialF, Tutorial2);
CheckTutorialFlag(&TutorialF, Tutorial1);
CheckTutorialFlag(&TutorialF, Tutorial3);
return 0;
}
void SetTutorialFlag(int* _Tutorial, int TutorialNum)
{
*_Tutorial |= TutorialNum;
printf("Tutorial Complete : %d\n", *_Tutorial);
}
void RemoveTutorialFlag(int* _Tutorial, int TutorialNum)
{
*_Tutorial ^= TutorialNum;
printf("Tutorial Incomplete : %d\n", *_Tutorial);
}
void CheckTutorialFlag(int* _Tutorial, int TutorialNum)
{
printf("Tutorail : %s\n", (*_Tutorial & TutorialNum) > 0 ? "Complete" : "Incomplete");
}
-
열거형(enum)
상수를 문자화 시켜서 편하게 정수를 사용할 수 있고 코드의 가독성도 높일 수 있다.비트플래그에 사용할 정수이기 때문에 2의 거듭제곱을 상수로 사용한다.
-
TutorialF 변수는 튜토리얼의 현재 단계를 체크하는 변수이다.
SetTutorialFlag 함수는 현재 단계를 | 연산을 사용해 갱신한다.
현재 단계를 저장하는 변수와 상수를 매개변수로 받는다. |(or)연산을 하면 해당 플래그는 1로 바뀌어 단계가 갱신된다.RemoveTutorialFlag 함수는 해당 단계가 수행되지 않은 단계를 지워주는 기능을 한다. 지우고 싶은 단계를 상수로 받아서 ^(xor) 연산으로 두 비트를 비교해 서로 같으면 0이 된다.
CheckTutorialFlag 함수는 현재 해당 단계를 완료했는지를 체크해서 완료여부를 출력한다. 현재 단계를 저장하는 변수와 해당 단계를 & 연산을 해서 0보다 크면 Complete를 아니면 Incomplete를 출력한다.