비트단위연산자
각각의 비트끼리 계산하는 연산자
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;
}
'개발 소발 > 개발 C++(기초)' 카테고리의 다른 글
c++ 전역변수,정적변수,내부연결,외부연결 (0) | 2019.07.05 |
---|---|
c++ 지역변수,범위,지속기간 (0) | 2019.07.05 |
c++ 연산자종류 (0) | 2019.07.03 |
c++ 문자형,리터럴상수,심볼릭상수 란? (0) | 2019.07.01 |
c++ 정수형,부동소수점수란? (0) | 2019.06.28 |