앞서 얘기했던 비트 연산자들이 게임에서 어떻게 활용되는지 예시를 들어보겠다.
먼저 6번째 줄에서 int형 변수 state 는 32개의 비트가 모두 0으로 초기화 돼있는 상태이다.
여기서 비트 연산자 |를 통해 1이라는 값을 가지고 있는 정의어 HUNGRY와 합 연산을 할경우
맨 뒤에 자리의 비트의 값이 1이 되게된다. 즉 000000000...000인 비트값을 가지고 있던 state가
00000000000...001이 되는 것이다.
이를 활용해 위 코드처럼 작성하게 되면 어떠한 상태값을 원하는 state 변수하나만 으로
원하는 비트 자리에 저장하고 기록할수 있게 되는것이다.
즉 위에 그림처럼 특정 자리의 비트 값이 1이되면 그것이 곧 그 상태가 ON이 됐다는 것을 정의 할수 있게 되는것이다.
HUNGRY비트 값이 1이 되면 Player가 배고픈 상태구나.. 이런 식으로 활용할수 있게 되는것이다.
int형 변수인 state 는 4byte 즉 32bit의 크기를 가지므로 총 32가지의 상태값을 state 변수를 활용해서 저장하고 관리할수 있게 되는것이다.
예를들면 위 코드처럼 state 에 &연산을 통해 해당 자리의 비트가 1인지 0인지 판단할수 있다는 것이다.
SLEEPY를 나타내는 비트는 뒤에서 3번째 비트로 아래 그림처럼,
&연산을 통해 해당 값이 1이됨을 알수있고 if문 조건이 참이되어 안에 있는 코드를 동작시키게 될것이다.
또한 예를들어 플레이어가 배고픈 상태였는데 해당 상태를 해제하고 싶다면 비트 연산을 통해 해당 비트만 제거를 할수도있다.
HUGRY 비트값을 ~을 통해 반전시킨후 그 반전 시킨 값을 다시 state에 곱연산을 하게되면 HUGRY의 비트값만 0으로 변하게 된다.
이런식으로 해당 비트값만 0으로 변경하는 작업도 가능하다.
비트 연산을 활용하면 변수 한가지로 총 32가지의 상태값을 활성화하거나 비활성화 할수있게 되는것이다.
좀 더 나아가 #define으로 상태값을 저장할때 0x로 16진수로 값을 상태값을 저장하면 가독성이 좋게 상태값을 만들수 있다. 이렇게 비트 연산을 통해 상태값을 저장하는 변수를 만들게 되면 나중에 함수나 다른 클래스에서 값에 접근할때
여러개의 인자값을 넘겨주지 않고 state하나만 넘겨줘도 32가지의 상태를 한번에 보내주는 방식이 되기때문에 잘 사용하면 좋은 활용방법이 될수있다.
'C++' 카테고리의 다른 글
C++ 분할 구현 (헤더 파일) (0) | 2023.11.09 |
---|---|
C++ 함수 호출(메모리 영역) (0) | 2023.11.05 |
C++ 비트 연산자 (&, |, ^, ~) (2) | 2023.11.04 |
C++ 비트 연산(시프트 연산) (0) | 2023.11.04 |
C++ 실수 표현 방식 (0) | 2023.11.03 |