[C언어/C++] 비트 플래그 (Bit Flag) 사용법 & 예제 (비트연산 활용)

2진수는 숫자를 표현할때 0과 1 두 가지 값으로만 표현합니다. 여기서 0과 1을 On / Off로 사용하는 개념을 비트 플래그라고 합니다. 이것을 어디에다 사용하냐?라고 반문하실 수도 있는데 전혀 사용성이 없는 것은 아니고 한 번에 여러 가지 속성을 동시에 지정할 때, 편리하게 사용할 수 있는 방법 중에 하나가 비트 플래그입니다. 

 

비트 플래그를 사용하면 좀 더 공간을 효율적으로 사용할 수 있습니다. 단순 비교를 해보아도 8개의 상태를 저장하려면 bool 타입 변수 8개를 선언해야 할텐데 8비트의 char을 비트단위로 쪼개서 저장한다면 1개의 char 변수(1byte = 8bit)만으로도 8개의 상태를 저장할 수가 있죠.

 

비트 플래그 (Bit Flag) 사용 간단한 예제

#include <stdio.h>

int main() {

    unsigned char num = 0;
    int location = 0; // 비트 위치
    int status = 0; // 비트 상태

    for (;;) {
        printf("변경할 비트 위치(0 ~ 7) : ");
        scanf_s("%d", &location);
		
        printf("[ 0 : OFF ] / [ 1: ON ] : ");
        scanf_s("%d", &status);
        
        if (status == 0) { // OFF
            num &= ~(1 << location);
        }
        else if (status == 1) { // ON
            num |= 1 << location;
        }
        
        //비트 출력
        for (int i = 0; i < 8; i++) {
            int temp = num >> i & 1;
            printf("[%d] ", temp);
        }
        printf("\n\n");
    }
}

비트 플래그 예제

위의 예제처럼 비트 연산자를 활용하여 비트를 0과 1로 바꿀 수 있습니다. 위와 같은 방식을 사용하여 TRUE / FALSE 값을 저장, 활용한다면 메모리를 보다 절약할 수 있겠죠. 상태값을 바꾸는 비트 연산이 이해를 안 가시는 분들을 위해 아래에 간단한 설명을 참고합니다. 출력 부분은 아래 글을 참고해주세요.

[C언어] 10진수를 2진수로 출력하기 (비트연산 활용)

 

특정 위치 비트 상태값 1로 바꾸기

비트 플래그 과정1

특정 위치의 비트를 1로 바꾸는 방법은 위와 같습니다. 먼저 1을 << Shift연산을 통해 원하는 위치로 이동합니다. 예를 들어 2번째 위치의 비트를 변경시키려면 1 << 2 이렇게 해주시면 됩니다. 이렇게 Shift연산이 끝나면 00000100이 될 것입니다. 이를 OR 연산을 해주게 되면 상태 값이 1로 바뀌게 됩니다.

 

특정 위치 비트 상태값 0으로 바꾸기

비트플래그 과정2

특정 위치의 비트를 0으로 바꾸는 방법은 위와 같습니다. 역시 먼저 1을 << Shift연산을 통해 바꾸고 싶은 위치로 이동합니다. 그런뒤 ~ 연산을 통해 비트를 반전합니다. 비트를 반전하는 이유는 2가지가 있는데 Char형 비트 안에 1이 있다면 이후 & 연산을 통해 1로 유지시켜주기 위함과, 0으로 바꾸고 싶은 위치의 비트를 0으로 만들어주어 이후 AND연산을 통해 Char형의 비트를 0으로 만들어주기 위함입니다. 비트 반전이 끝났다면 & 연산을 통해 타겟 비트를 0으로 만들어줍시다.

댓글

Designed by JB FACTORY