비트단위연산자
각각의 비트끼리 계산하는 연산자
int등의 계산은 타입단위 계산이다.

과거에는 메모리가 충분하지 않았다.
bool은 0,1만으로 표현되지만 1Byte를 사용해야한다.

비트단위연산자를 통해 데이터를 많이 채워 넣을 수 있다.
그리고 속도가 더빨라진다.

<<,>>,~,&,|,^ 여섯가지가 있다.
<<,>>는 cout,cin에서 사용하는 것과는 다르다.

 

#include <iostream>
//2진수로 변경해주는 라이브러리
#include <bitset>

using namespace std;

int main()
{
	//<<,>>는 cout,cin 에서 사용하는건 다른 의미이다.

	unsigned int a = 3;

	//2진수가 출력된다.
	cout << std::bitset<4>(a) << " : " << a << endl;

	//이진수를 오른쪽으로 한자리씩 보낸다. 2면 두자리 이동한다.
	//1일때 6,2일때 12,3일때 24 2제곱(연산숫자)로 계산되는걸 알 수 있다.
	//2의 제곱을 곱하고 싶을경우에 훨씬 빠르게 사용할 수 있다.
	unsigned  int b = a << 4;

	cout << std::bitset<4>(b) << " : " << b <<  endl;

	a = 1024;
	//2진수가 출력된다.
	cout << std::bitset<16>(a) << " : " << a << endl;
	//<<와 반대로 나누기가 2가된다.
	b = a >> 1;
	cout << std::bitset<16>(b) << " : " << b << endl;
	b = a >> 2;
	cout << std::bitset<16>(b) << " : " << b << endl;
	b = a >> 3;
	cout << std::bitset<16>(b) << " : " << b << endl;
	
	//~ NOT 반대로 출력된다.
	cout << std::bitset<16>(a) << " : " << a << endl;
	cout << std::bitset<16>(~a) << " : " << ~a << endl;

	//&,^,|을 확인해보자.
	//AND,OR,XOR의 조건에 맞게 출력된다.
	//2진수 출력하기
	a = 0b1100;
	b = 0b0110;

	//아래형식으로 쓸 수 있다.
	a &= b;

	cout << std::bitset<4>(a & b) << endl;
	cout << std::bitset<4>(a | b) << endl;
	cout << std::bitset<4>(a ^ b) << endl;

	return 0;
}

비트플래그

bool타입은 1Byte라 8bit를 사용한다.

생각해보면 메모리 낭비가 심하다.

1바이트는 8bit이기에 bool타입을 8가지 정보를 사용할 수 있다.

메모리를 낭비하지않고 정보를 담고 싶을때 유용하게 사용할 수 있다.
게임 아이템 정보에 많이 사용된다.

#include <iostream>
#include <bitset>

using namespace std;

int main()
{
	//4가지 아이템이 있다고 가정해보자.
	bool item1_flag = false;
	bool item2_flag = false;
	bool item3_flag = false;
	bool item4_flag = false;

	//아이템이 많아지면 bool변수를 많이 만들어야한다.
	//함수를 만들면 최대 아이템갯수가 파라미터 갯수가 될 수도 있다.
	
	//아이템은 가지고있다,없다 두가지로 생각할 수 있다.
	
	//아이템이 8가지 종류가 있다는 가정하에 char를 사용한다.
	
	const unsigned char opt0 = 1 << 0;
	const unsigned char opt1 = 1 << 1;
	const unsigned char opt2 = 1 << 2;
	const unsigned char opt3 = 1 << 3;

	cout << std::bitset<8>(opt0) << endl;
	cout << std::bitset<8>(opt1) << endl;
	cout << std::bitset<8>(opt2) << endl;
	cout << std::bitset<8>(opt3) << endl;

	unsigned char items_flag = 0;
	//00000000이 출력된다.
	//8자리의 숫자로 숫자하나당 각자 아이템 소유정보를 저장한다.
	cout << "NoItem : " << std::bitset<8>(items_flag) << endl;
	
	//|= OR를 사용해 아이템 습득 정보를 변경할 수 있다.
	//0번째 자리의 아이템을 습득했다.
	items_flag |= opt0;
	cout << "0Item Get : " << std::bitset<8>(items_flag) << endl;
	
	items_flag |= opt3;
	cout << "3Item Get : " << std::bitset<8>(items_flag) << endl;

	//&= 와 ~을 이용해 아이템 분실을 변경 할 수 있다.
	//opt0 = 00000000이다.
	//~opt0 = 11111111이다.
	//AND조건을 사용하면 둘다 1일때만 1이기에 아이템정보를 0으로 변경한다.
	items_flag &= ~opt0;
	cout << "0Item Lost : " << std::bitset<8>(items_flag) << endl;

	//아이템 보유여부 확인
	if (items_flag & opt3) {
		cout << "3번아이템 보유중" << endl;
	}

	//아이템 보유여부 확인
	if (items_flag & opt0) {
		cout << "0번아이템 보유중" << endl;
	}
	else {
		cout << "0번아이템 없음" << endl;
	}
	
	//두가지 아이템 습득할 경우
	//opt0 | opt1 는 00000011이다.
	items_flag |= (opt0 | opt1);

	if ((items_flag & opt1) && !(items_flag & opt2)) {
		items_flag ^= opt1;
		items_flag ^= opt2;
	}
	cout << std::bitset<8>(items_flag) << endl;


	unsigned int pixel_color = 0xDAA520;

	cout << std::bitset<32>(pixel_color) << endl;

	unsigned char red, green, blue;
	return 0;
}

+ Recent posts