비트 플래그(Bit Flag)
🖥️ 비트 플래그(Bit Plag)란?
데이터의 각 비트를 플래그, 즉 참과 거짓 상태를 나타낼 때 사용하는 기법이다.
비트 플래그를 사용함으로써 여러 상태를 효율적으로 저장하고 조작할 수 있다.
🖥️ 비트 플래그 연산의 장점
- 하나의 정수형 변수에 여러 상태 저장할 수 있어, 메모리 효율성이 좋다.
- 연산 속도가 매우 빠르다.
- 플래그를 의미 있는 이름으로 정의하면 코드 이해가 쉬워져 가독성이 좋다.
※ 평소 자주 쓰는 bool 타입의 변수는 여러 상태를 저장하려면 변수도 여러 개가 필요하지만, 비트 플래그는 1개의 변수를 비트 단위로 쪼개서 상태를 저장할 수 있다.
🖥️ 주로 사용하는 비트 플래그 연산
- AND 연산 (
&
)- 특정 비트가 설정되었는지 확인.
- OR 연산 (
|
)- 특정 비트를 설정(켜기).
- XOR 연산 (
^
)- 특정 비트를 토글(반전).
- NOT 연산 (
~
)- 모든 비트를 반전. 5.비트 쉬프트 (
<<
,>>
) - 비트를 왼쪽이나 오른쪽으로 이동.
- 모든 비트를 반전. 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