비트 플래그

1 minute read


1. 비트 연산자(bit flag)

  • AND(&)

    bit_operator_and

    대응되는 비트가 모두 1이면 1을 다른 경우는 0을 반환한다.

  • OR(|)

    bit_operator_or

    대응되는 비트 중 하나라도 1이면 1을 반환한다.

  • XOR(^)

    bit_operator_xor

    대응되는 비트가 서로 다르면 1을 반환한다.

  • NOT(~)

    bit_operator_not

    비트를 1이면 0으로, 0이면 1로 반전시킨다.

  • Shift Operator

    bit_operator_shift

    쉬프트 연산자는 비트를 왼쪽 또는 오른쪽으로 한칸씩 이동시키는 기능을 한다.

    비어있는 칸은 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를 출력한다.