본문 바로가기

카테고리 없음

C++ bitwise Operators, Bit flags, Bit masks

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;
}