공부중

[C/C++] Bit연산을 이용한 아이템 장착 유무 관리 및 판별 본문

Programing/C, C++

[C/C++] Bit연산을 이용한 아이템 장착 유무 관리 및 판별

곤란 2015. 10. 31. 21:58
반응형

몇 일전 모 회사의 필기시험 보러 갔다가 멘붕 당해와서 공부를 하려고 한다.

 

아오….. 존나 나의 뇌는 쓰레기인가보다.

 

먼저 당황했던건 머릿속에 있는 비트연산이라는 폴더가 있지만 파일이 없는 관계로

다시 정리하고 제목에 있는 것을 간단히 만들어 보려고 한다.(이야 존나 소 잃고 외양간 강철로 짓기)

 

일단 존나 음…… 간단하게 정리하면

 

컴퓨터는 모든 데이터의 표현 및 연산을 2진수로 처리한다. (11 01 01 10 10 00 11 00 10 이런 거로 한다고 한다… )

 

혹시 몰라서 2진수라는걸 말하면 데이터를 표현하는데 2개의 숫자를 쓰겠다는 것이다.

(그래서 0 과 1을 쓴다. – 왜 다른 숫자도 많은데 하필 0과 1을 쓰냐고 물으면 나도 모른다. 10진법에 길들여진 우리가 보기 편하고 생각하기 편하라고 했나보지)

 

그리고 비트라는 것은 컴퓨터가 나타내는 데이터의 최소 단위로서 2진수의 값 하나 (0또는 1)를 저장할 수 있는 메모리 공간을 의미한다.

이런 비트 8개가 모여서 바이트가(byte)가 된다. (8 bit == 1 byte)

 

여기서 부호비트, 올림 수(carry)에 관한 설명은 제외하고 바로 제목에 대한 본문에 들어가기 앞서 비트연산자라는 녀석을 보면.

 

연산자

연산자 의미

결합성

비트 단위 AND

ex) a & b

비트단위 OR

ex) a | b

비트단위 XOR

ex) a ^ b

비트단위 NOT

ex) ~a

<< 

왼쪽으로 이동

ex) a << 2 

>> 

오른쪽으로 이동

ex) a >>2

 

AND(&)는 두 개의 비트가 모두 1일 때 1을 반환하는 연산이다.

0 & 0 -> 0 반환

0 & 1 -> 0 반환

1 & 0 -> 0 반환

1 & 1 -> 1 반환

 

 

 

OR(|)는 두 개의 비트 중 하나라도 1이면 1을 반환한다.

0 | 0 -> 0 반환

0 | 1 -> 1 반환

1 | 0 -> 1 반환

1 | 1 -> 1 반환

 

 

XOR(^)는 두 개의 비트가 서로 다를 경우에 1을 반환하는 연산이다.

0 ^ 0 -> 0 반환

0 ^ 1 -> 1 반환

1 ^ 0 -> 1 반환

1 ^ 1 -> 0 반환

 

 

NOT(~)연산은 비트(bit)를 반전시킨다.

~0 -> 1반환

~1-> 0반환

 

 

<<, >>는 비트를 이동시키는 연산이다.

a << b : a의 비트들을 b칸씩 왼쪽으로 이동한 값을 반환

8 << 2 : 8 의 비트들을 2칸씩 왼쪽으로 이동한 값을 반환

a >> b : a의 비트들을 b칸씩 오른쪽으로 이동한 값을 반환

8 >> 2 : 8의 비트를 오른쪽으로 2칸씩 이동한 값을 반환

 

 

 

 

1비트씩 왼쪽으로 이동할 때마다 값이 두 배가 되는 모습이 보이고

오른쪽으로 이동 할 때는 음수의 경우에 시스템에 따라서 다른 모습을 보여준다.

이 시스템이 아마 CPU를 말하는 것 같은데

 

결과는 크게 딱 두 가지

맨 왼쪽 비트에 0이 들어오거나 1이 들어오는 현상이 있다.

 

위의 스크린 샷 은 Intel CPU를 사용 중에 나온 결과이다.

 

 

 

비트 연산에 관한 설명은 이렇게 있고 … 음 ….

이걸 활용한 방법은…

 

#include <iostream>

 

int equip = 0;

 

enum equipActive

{

    helmet = 1<<7,

    weapon = 1<<6,

    boots = 1<<5,

    shield = 1<<4,

    ring = 1<<3,

    neck = 1<<2,

    Armor = 1<<1,

    hand = 1<<0

};

 

 

bool foo( int val )

{

    return (((val & weapon) != 0)? true : false);

}

 

int main()

{

    //템 얻음

    equip = helmet | weapon | Armor | ring | neck | shield;

 

    std::cout << equip << std::endl;

 

    //템 잃음

    equip = equip & ~weapon;

 

    std::cout << equip << std::endl;;

 

 

    //템 있냐?

    if (foo(equip))

    {

        std::cout << "있당" << std::endl;;

    }

    else

    {

        std::cout << "음똬" << std::endl;;

    }

 

    return 0;

}

 

결과는…

저 템 잃음 부분 없을 경우.

 

 

 

 

 

 

반응형