C++에서 비트연산자는 효율적인 상태 관리를 위해 사용한다.
주로 상태를 관리할 때 사용되며, 가독성도 좋고 매우 효율적이고 메모리 절약에 도움이 되기 때문이다.
비트연산자의 기본 개념
& - (AND) 두 비트가 모두 1이면 결과가 1이다.
| - (OR) 두 비트 중 하나라도 1이면 결과가 1이다.
^ - (XOR) 두 비트가 다르면 1이다.
~ - (NOT) 비트를 반전시킨다. 0 > 1 // 1 > 0
<< - (왼쪽 시프트) 비트를 왼쪽으로 이동시킨다.
>> - (오른쪽 시프트) 비트를 오른쪽으로 이동시킨다.
상태 정의
아래의 코드블럭은 보통 상태를 정의할 때 사용하는 방법이다. 각 상태는 2의 제곱수로 정의되어있으며,
"1 2 4 8 16 32 64 128" 등 10진수로 표현하는 것 보다 16진수로 표현하는것이 아래처럼 가독성이 좋아진다.
주석은 비트를 표현했다. 16진수로 표현시 아래의 규칙이 계속해서 이어진다.
#define WALK 0x001 // 0001
#define RUN 0x002 // 0010
#define SLEEP 0x004 // 0100
#define EAT 0x008 // 1000
#define WORK 0x010 // 1 0000
#define PLAY 0x020 // 10 0000
#define REST 0x040 // 100 0000
활용하기
상태를 추가하는 예시를 알아보자
unsigned int iStatus = 0; // iStatus라는 변수를 선언해주고
iStatus |= WALK; // iStatus에 WALK 상태 추가
iStatus |= RUN; // iStatus에 RUN 상태 추가
이 코드가 실행되고나면 iStatus의 비트는 00000011이다.
벌써 이해가 안된다면 이 글을 처음부터 다시 읽어야한다.
이번에는 상태를 확인하는 예시를 보자
if (iStatus & WALK) {
// WALK 상태가 켜져 있음
}
if (iStatus & RUN) {
// RUN 상태가 켜져 있음
}
위 코드에서 iStatus & WALK는 iStatus의 WALK 비트가 1인지 확인하고 1이라면 조건문이 참이된다.
이번에는 상태를 제거해보자
RUN상태를 제거하려면 아래의 코드를 작성하면 된다.
iStatus &= ~RUN; // RUN 상태 제거
RUN의 비트는 00000010이고 이걸 반전시키면 11111101이다.
&는 두 비트가 모두 1이여야 1을 뱉으니 iStatus에 있는 RUN비트의 자리에는 0이있든 1이있든 0이 반환된다.
그리고 반전이 되며 RUN비트의 자리를 제외하고는 모두 1이되면서, 다른자리에 아무런 영향을 끼치지 않는다.
(0이었다면 0 1이었다면 1로 RUN자리를 제외하고는 아무런 변화가 없음)
여기까지가 자주 쓰이는 비트연산자의 활용이다.
이정도 개념은 C++를 배운다면 기억을 해 두는것이 좋아보여서 정리를 하려고 했는데,,,
내일 일어나서 해야지라고 생각하니 잠이 안와서 이시간에 정리를 하게 되었다.