비트 플래그(Bit Flag)


🖥️ 비트 플래그(Bit Plag)란?

데이터의 각 비트를 플래그, 즉 참과 거짓 상태를 나타낼 때 사용하는 기법이다.
비트 플래그를 사용함으로써 여러 상태를 효율적으로 저장하고 조작할 수 있다.


🖥️ 비트 플래그 연산의 장점

  1. 하나의 정수형 변수에 여러 상태 저장할 수 있어, 메모리 효율성이 좋다.
  2. 연산 속도가 매우 빠르다.
  3. 플래그를 의미 있는 이름으로 정의하면 코드 이해가 쉬워져 가독성이 좋다.


※ 평소 자주 쓰는 bool 타입의 변수는 여러 상태를 저장하려면 변수도 여러 개가 필요하지만, 비트 플래그는 1개의 변수를 비트 단위로 쪼개서 상태를 저장할 수 있다.


🖥️ 주로 사용하는 비트 플래그 연산

  1. AND 연산 (&)
    • 특정 비트가 설정되었는지 확인.
  2. OR 연산 (|)
    • 특정 비트를 설정(켜기).
  3. XOR 연산 (^)
    • 특정 비트를 토글(반전).
  4. NOT 연산 (~)
    • 모든 비트를 반전. 5.비트 쉬프트 (<<, >>)
    • 비트를 왼쪽이나 오른쪽으로 이동.

🖥️ C++ 예제

#include <iostream>
using namespace std;

// 비트 플래그 정의
const int FLAG_READ    = 1 << 0; // 0001
const int FLAG_WRITE   = 1 << 1; // 0010
const int FLAG_EXECUTE = 1 << 2; // 0100
const int FLAG_DELETE  = 1 << 3; // 1000

void checkPermissions(int flags) {

    printf("[권한]\n");

    ////// AND 연산으로 특정 비트가 설정되었는지 확인.
    if (flags & FLAG_READ)    
        printf("- Read\n");

    if (flags & FLAG_WRITE)   
        printf("- Write\n");

    if (flags & FLAG_EXECUTE) 
        printf("- Execute\n");

    if (flags & FLAG_DELETE)  
        printf("- Delete\n");
}

int main() {

    int permissions = 0; //초기 플래그 : 모두 꺼짐. (0000)

    //플래그 설정.
    ////// OR 연산으로 특정 비트를 켜줌.
    permissions |= FLAG_READ; //'읽기' 권한 추가.
    permissions |= FLAG_WRITE; //'쓰기' 권한 추가.

    printf("READ, WRITE 권한 추가 후 상태 확인 : \n");
    checkPermissions(permissions);

    //플래그 해제.
    ////// NOT 연산으로 비트를 반전시켜 특정 비트를 꺼줌.
    permissions &= ~FLAG_WRITE; //'쓰기' 권한 제거.

    printf("\nWRITE 권한 제거 후 상태 확인 : \n");
    checkPermissions(permissions);

    //플래그 토글.
    ////// XOR 연산으로 현재 비트를 반전시킴.
    permissions ^= FLAG_EXECUTE; //'실행' 권한 토글. (OFF -> ON)
    printf("\nEXECUTE 권한 토글 후 상태 확인 : \n");
    checkPermissions(permissions);

    return 0;
}

✔️ 실행 결과

READ, WRITE 권한 추가 후 상태 확인 : 
[권한]
- Read
- Write

WRITE 권한 제거 후 상태 확인 : 
[권한]
- Read

EXECUTE 권한 토글 후 상태 확인 : 
[권한]
- Read
- Execute


© 2024. All rights reserved.

Powered by Hydejack v9.2.1