Bitwise Operators
#include <iostream>
int main()
{
using namespace std;
unsigned int a, b;
a = 3;
cout << std::bitset<4>(a) << endl;
unsigned int b = a << 2; //2자리 위로 shift 시킨 것
//bitwise operator
cout << std::bitset<8>(a << 1) << " " << (a << 1) << endl;
cout << std::bitset<8>(a << 2) << " " << (a << 2) << endl;
cout << std::bitset<8>(a << 3) << " " << (a << 3) << endl;
cout << std::bitset<8>(a << 4) << " " << (a << 4) << endl;
a = 0b1100;
b = 0b0110;
cout << std::bitset<4>(a & b) << endl; //and
cout << std::bitset<4>(a | b) << endl; //or
cout << std::bitset<4>(a ^ b) << endl; //xor
return 0;
}
bit flags
flag는 깃발로 깃발 들어 내려 처럼 on off로 표현이 가능하기 때문에 나온 표현이다.
boolean 변수를 표기할때 bool를 사용하게 되면 정작 1 bit의 저장공간만 필요로 하는데 8bit = 1byte를 사용하게 된다. 즉 7bit의 공간을 낭비하고 있는 것이다. 그래서 unsigned char를 이용해 1 bit만 가지고 표현할 수 있다.
#include <iostream>
int main()
{
using namespace std;
/// bit flags
bool item1_flag = false;
bool item2_flag = false;
bool item3_flag = false;
bool item4_flag = false;
//event!
item1_flag = true;
//die! item2 lose
item2_flag = false;
if (item3_flag == true)
{
//event
}
// 아이템이 바뀌는 것
if (item3_flag == true && item4_flag == false)
{
item3_flag = false;
item4_flag = true;
}
//bit flags
unsigned char items_flags = 0;
const unsigned char opt0 = 1 << 0;
const unsigned char opt1 = 1 << 1;
const unsigned char opt2 = 1 << 2;
const unsigned char opt3 = 1 << 3;
//opt4, 5, 6, 7도 같은 방식으로 가능함
cout << bitset<8>(items_flags) << "\n"
<< endl;
cout << bitset<8>(opt0) << endl;
cout << bitset<8>(opt1) << endl;
cout << bitset<8>(opt2) << endl;
cout << bitset<8>(opt3) << endl;
cout << "No item " << bitset<8>(items_flags) << endl;
//item0 on
items_flags |= opt0; //bitwise OR 아이템이 있는지 찍어봄
cout << "Item0 obtained " << bitset<8>(items_flags) << endl;
//item3 on
items_flags |= opt3; //bitwise OR 아이템이 있는지 찍어봄
cout << "Item0 obtained " << bitset<8>(items_flags) << endl;
//item3 lost
items_flags &= ~opt3;
cout << "Item3 lost" << bitset<8>(items_flags) << endl;
// has item1 ?
if (items_flags & opt1)
{
cout << "Has item1" << endl;
}
else
{
cout << "Not have item1" << endl;
}
// has item0 ?
if (items_flags & opt0)
{
cout << "Has item0" << endl;
}
else
{
cout << "Not have item0" << endl;
}
//obtain item 2, 3
items_flags |= (opt2 | opt3); // 두개의 아이템을 동시에 작동시키는 것
cout << bitset<8>(opt2 | opt3) << endl;
cout << "Item0 obtained " << bitset<8>(items_flags) << endl;
if ((items_flags & opt2) && !(items_flags & opt1))
{
items_flags ^= opt2; //상태를 바꾸어 줄때는 XOR
items_flags ^= opt1;
}
cout << bitset<8>(items_flags) << endl;
return 0;
}
-----------
포토샵 일러스트에서도 Color를 Hex code로 사용한다.
웹프로그래밍을 할때도 색을 지정할 때 Hex code로 사용한다.
이때 알 수 없는 숫자들로 이루어진 것을 사용하는데 16진수로 표현되는 것이다.
#RRGGBB로 디스플레이 상에는 RGB로 이루어져 있는데 이는 0~255까지 표현된다. 즉 알 수 없는 영어들은 RGB의 농도라고 볼 수 있다.
특정 색을 뽑아낸다고 할때 bit masks가 사용된다.
#include <iostream>
#include <bitset>
using namespace std;
int main()
{
const unsigned int red_mask = 0xFF0000; //red만 뽑아내기 위해서
const unsigned int green_mask = 0x00FF00;
const unsigned int blue_mask = 0x0000FF;
cout << std::bitset<32>(red_mask) << endl;
unsigned int pixel_color = 0xDAA520;
cout << std::bitset<32>(pixel_color) << endl; // 16진수를 2진수로 변경
//blue 부분만 추출
unsigned char blue = pixel_color & blue_mask;
unsigned char green = (pixel_color & green_mask) >> 8; // 가운데에 있기 때문에
cout << std::bitset<8>(blue) << endl;
cout << std::bitset<8>(green) << endl;
return 0;
}