비트논리 연산자 어디에 사용할까?

in #kr-dev7 years ago


안녕하세요!! @wonnieyoon입니다.
오늘은 논리 연산자에 대해 포스팅해볼까 합니다.

c,c++ 언어들에서 비트 논리 연산자를 배우게 됩니다.
그런데 이런 논리를 가지고 있구나는 알겠는데 직접적인 경험은 없는 경우가 많더라구요.
오늘은 간단하게 비트논리 연산자를 게임에 적용해 보겠습니다.

RPG 게임을 하게 되면 기본적으로 빠질수 없는 요소가 있죠!!
그건 바로 '버프' 인데요.

버프를 구성하는 방법에 대해 간단하게 포스팅해보겠습니다.

c++에서 int는 4Byte(=32bit)를 차지합니다.
그럼 2진수로는 32자리 , 16진수로는 8자리를 나타낼수 있다는 말이죠.
이정도만 알아 두시고 코드를 설명하겠습니다.

int main()
{
// 먼저 const를 붙이는 이유는 iAttack등의 변수는 특정 버프의 고유값을 가지게
// 되는데 만약 프로그래머가 실수로 변수에 값을 바꿀수 있기 때문에 상수화 시켜놓기
// 위해서 const를 붙입니다.

const int iAttack = 0x00000001; //1 (2진수) // 공격버프
const int iArmor = 0x00000002;  //10        // 방어버프
const int iHP = 0x0000004;      //100       // HP 버프
const int iMP = 0x0000008;      //1000
const int iCritical = 0x00000010; //10000

int iBuf = iAttack | iHP | iCritical;  
// iAttack | iHP => 00001 | 00100 => 00101
// 00101 | iCritical => 10101       

// 10101 & 00001 = 1
cout << (iBuf & iAttack) << endl; //=> attack 버프가 있다는 의미

// 10101 & 00010 = 0
cout << (iBuf & iArmor) << endl; //=> 0 방어 버프가 없다는 의미

// 10101 & 00100 = 4
cout << (iBuf & iHP) << endl; //=> HP 버프가 있다는 의미

// 10101 & 01000= 0
cout << (iBuf & iMP) << endl; //=> 0  MP 버프가 없다는 의미

// 10101 & 10000 = 0
cout << (iBuf & iCritical) << endl; //=> Critical 버프가 있다는 의미

return 0;

}
그런데 비트논리 연산자를 왜 사용할까요?
그냥 배열을 사용해서 충분히 버프를 표현할수 있을것 같은데?
비트논리 연산자는 이진수 연산을 하기 때문에 일반적인 연산보다 컴퓨터가
빠르게 연산을 할수 있기 때문에 속도의 이유로 사용합니다.

또한 XOR의 사용으로 버프를 없앴다 만들었다 할수있습니다. ( on ,off)
iBuf ^= iHP;
=> 10101 ^ 00100 = 10001
Buf의 목록에서 HP는 사라지게 됩니다.

하지만 다시
iBuf ^= iHP;
=> 10001 ^ 00100 = 10001 이 됩니다. ㅎㅎ

Sort:  

(jjangjjangman 태그 사용시 댓글을 남깁니다.)
호출에 감사드립니다! 즐거운 스티밋하세요!