ted0505
Computational Art & Study
ted0505
전체 방문자
오늘
어제
  • 분류 전체보기 (79)
    • Computer Science ( CS ) (0)
    • Computational Thinking (6)
    • 프로젝트 개발일지 (1)
    • Coding (52)
      • C++ (39)
      • JavaScript (2)
      • P5.JS (7)
      • Python (0)
      • HTML5 (1)
      • CSS (0)
    • Game Engine (18)
      • Unreal Engine 4 (18)
      • Unity (0)
    • Physically Based Rendering (0)
    • FilmMaking (0)
    • 잡다 (0)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
ted0505

Computational Art & Study

Coding/C++

[ C++ ] 비트 플래그, 비트 마스크 ( bit flag, bit masks )

2022. 1. 26. 16:19

비트 플래그, 비트 마스크 ( 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
    'Coding/C++' 카테고리의 다른 글
    • [ C++ ] Chapter 4.2 : 전역 변수, 정적 변수, 내부 연결, 외부 연결
    • [ C++ ] Chapter 4.1 : 지역변수, 범위, 지속기간
    • [ C++ ] 비트 단위 연산자 Bitwise Operators
    • [ C++ ] 논리 연산자 (Logical Operators)
    ted0505
    ted0505

    티스토리툴바