비트 플래그, 비트 마스크 ( bit flag, bit masks )
#비트 플래그란 ?
0000 0001
플래그(flag)는 깃발에서 유래한 용어다. 보통 깃발을 위로 올리면 on, 아래로 내리면 off를 뜻한다. 이걸 정수의 비트에 활용하는 건데 비트가 1이면 on, 0이면 off를 나타낸다.
메모리의 최소 단위는 1바이트 ( 8 bit ) 다. 즉 변수도 최소 1바이트 이상인 것이다.
1바이트는 8비트이므로 총 8개의 상태 값을 저장할 수 있다.
변수의 최소 단위는 1바이트 이기 때문에 bool 자료형은 1비트만 사용하고 7비트는 낭비하게 된다.
예를 들어, 게임에서 8가지의 능력을 획득하고 잃을 수 있다고 가정해보자. bool 자료형으로 8가지의 값을 표현한다면 각 7비트씩 낭비하기 때문에 메모리 관리에 비효율적일 수 밖에 없다.
메모리를 효율적으로 사용하고자 플래그를 사용하여 비트를 조작하는 것이 좋다.
바이트의 개별 비트를 on / off 하는 것을 비트 플래그 ( bit flag ) 라 한다.
#비트 플래그 정의
비트 플래그를 사용하려면 바이트 내에서 각 개별 비트를 식별할 수 있도록 비트를 조작해주어야한다.
unsigned char opt0 = 1 << 0; // 상태 정의
unsigned char opt1 = 1 << 1;
unsigned char opt2 = 1 << 2;
unsigned char opt3 = 1 << 3;
#비트 플래그를 사용한 비트 조작
##조작할 변수 선언
// 8가지 옵션을 담기 위한 8비트 자료형 사용.
unsigned char items_flag = 0;
cout << "No item " << bitset<8>(items_flag) << endl;
##비트 켜기 / 능력을 얻었을 때
비트 OR 연산자(|)를 사용해 비트를 켤 수 있다.
// item0 On
items_flag |= opt0;
cout << "item0 Obtained " << bitset<8>(items_flag) << endl;
##비트 끄기 / 능력을 잃었을 때
비트 AND 연산자(&)와 비트 NOT 연산자(~)를 사용해 비트를 끌 수 있다.
// item3 Lost
items_flag &= ~opt3; // '&=' 가지고 있다. 여기에 Not연산자를 붙이니 가지고 있지 않다.
cout << "item3 Obtained " << bitset<8>(items_flag) << endl;
##비트 뒤집기 / 토글처럼 사용할 때
비트 XOR 연산자(^)를 이용해서 비트를 토글(toggle)할 수 있다.
// item3 toggle
items_flag ^= opt3;
cout << "item3 toggle " << bitset<8>(items_flag) << endl;
##비트가 켜져있는지 꺼져있는지 확인하기
비트 AND 연산자(&)를 이용해서 비트의 상태를 알 수 있다.
if(items_flags & opt0) {
cout << "Yes, is true" << endl;
}else{
cout << "No, is false" << endl;
}
##예시
items_flag |= opt1;
// opt1 ON, opt2 OFF
if ((items_flag & opt1) && !(items_flag & opt2))
{
items_flag ^= (opt1 | opt2);
}
cout << bitset<8>(items_flag) << endl;
#예제
#include <iostream>
#include <bitset>
using namespace std;
int main() {
unsigned char option_viewed = 0x01;
unsigned char option_edited = 0x02;
unsigned char option_liked = 0x04;
unsigned char option_shared = 0x08;
unsigned char option_deleted = 0x80;
unsigned char my_article_flags = 0;
cout << bitset<8>(my_article_flags) << endl;
my_article_flags |= (option_viewed | option_liked | option_shared);
cout << bitset<8>(my_article_flags) << endl;
my_article_flags &= ~option_liked;
if (my_article_flags & option_liked) {
cout << "Yeah~" << endl;
}
else {
cout << "What the Fuck?" << endl;
my_article_flags &= ~(option_viewed | option_shared);
my_article_flags |= option_deleted;
cout << bitset<8>(my_article_flags) << endl;
}
return 0;
}
'Coding > C++' 카테고리의 다른 글
[ C++ ] Chapter 4.2 : 전역 변수, 정적 변수, 내부 연결, 외부 연결 (0) | 2022.01.30 |
---|---|
[ C++ ] Chapter 4.1 : 지역변수, 범위, 지속기간 (0) | 2022.01.29 |
[ C++ ] 비트 단위 연산자 Bitwise Operators (0) | 2022.01.24 |
[ C++ ] 논리 연산자 (Logical Operators) (0) | 2022.01.23 |
[ C++ ] 02.08 상수 constants (0) | 2022.01.18 |