[C++]비트 연산자에 관하여

네,가능합니다 ㅣ 2024. 10. 21. 02:02

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++를 배운다면 기억을 해 두는것이 좋아보여서 정리를 하려고 했는데,,,

내일 일어나서 해야지라고 생각하니 잠이 안와서 이시간에 정리를 하게 되었다.