프로그래머/CPP_강의정리

cpp 비트 연산과 비트 플래그

미역국마싯 2021. 8. 21. 17:33

비트 연산

비트 단위의 조작이 필요할 때 사용한다.

 

  • ~ : bitwise NOT
    • 단일 숫자의 모든 비트를 대상으로 0은 1, 1은 0으로 뒤바꾼다.
    • 0000 0010 -> 1111 1101
  • & : bitwise AND
    • 두 숫자의 모든 비트 쌍을 대상으로 and 연산을 한다.
    • 0100 1100 & 0110 1001 = 0100 1000
  • | : bitwise OR
    • and 연산과 같은 방식으로 연산한다.
  • ^ : bitwise XOR
    • XOR 연산의 특징
      1. 같은 두 숫자에 xor 연산을 하면 모든 bit가 0이 된다.
      2. 하나의 숫자를 두 번 xor 연산을 하면 원래 bit로 되돌아온다.
  • << : 비트 좌측 이동
    • 비트열을 N만큼 왼쪽으로 이동
    • 왼쪽의 넘치는 N개의 bit는 버린다.
    • 새로 생성되는 오른쪽 N개의 bit는 0이 된다.
      • 1011 0001를 왼쪽으로 2bit 이동 -> 1100 0100
  • >> : 비트 우측 이동
    • 비트열을 N만큼 오른쪽으로 이동
    • 오른쪽의 넘치는 N개의 bit는 버린다.
    • 새로 생성되는 왼쪽 N개의 bit는 경우에 따라 다르다.
      1. 부호 bit가 존재할 경우 부호 bit를 따라간다
      2. 아니면 0이다.
    • BitFlag에서는 unsigned 형식으로 나타낸다. 부호를 없애야 >> 를 하더라도 부호비트가 딸려오지 않기 때문이다.

 

비트 플래그

비트 플래그 사용 예시: 게임의 상태이상 적용 여부 판단

[무적][변이][스턴][공중부양] 등 총 32개의 상태이상이 있을 때

bool invincibility;
bool stunned;
... 총 32개의 변수를 생성해야 한다.

하지만 비트 플래그를 사용하면 간단하다. 이는 숫자로 상태이상을 나타내는 방법이다.

  • [무적] == 1000
  • [변이] == 0100
  • [스턴] == 0010
  • [공중부양] == 0001
  • [무적]과 [변이] 상태 == 1100
  • [스턴]과 [공중부양] 상태 == 0011
unsigned char flag;

// 무적
flag = (1 << 3);	// 1 bit를 3번 왼쪽으로 이동, 1000

// [무적 + 변이] 상태
flag |= (1 << 2);	// 1000 or 0100 == 1100

// 무적인지 확인 (다른 상태는 관심x)
bool invincible = ((flag & (1 << 3)) != 0);	// bitmask

// 무적이거나 스턴인지 확인
bool stunOrInvincible = ((flag & 0b1010) != 0);

int mask = (1 << 3) | (1 << 1);
bool stunOrInvincible2 = ((flag & mask) != 0);

flag = 8; 처럼 표현하지 않는 이유는 숫자가 커질수록 한 눈에 어떤 비트인지 파악하기 어렵기 때문이다.

157을 비트로 표현해보면 알 수 있다.

 

bitmask

마스크는 가리고 싶은 것만 가리는 도구이다. 여기서 bitmask라 하면 특정 bit만 가리고 싶다는 뜻이다.

따라서 관심있는 bit를 제외한 나머지 bit는 날려버린다고 생각하면 된다.

bool invincible에서 비트 연산의 의미는 무적을 제외한 나머지 상태를 0으로 만들었을 때, 결과값이 0(false)이 아니라면 무적상태라는 의미다.

 

 

출처

https://www.inflearn.com/course/%EC%96%B8%EB%A6%AC%EC%96%BC-3d-mmorpg-1/dashboard

 

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part1: C++ 프로그래밍 입문 - 인프런 | 강의

시리즈를 원활하게 학습하기 위한 기초적인 C++ 문법들에 대해 학습합니다. 어셈블리 언어부터 시작해서 기본 C++ 문법, STL, C++11까지 핵심적인 내용을 압축해서 다루게 됩니다., - 강의 소개 | 인

www.inflearn.com

 

'프로그래머 > CPP_강의정리' 카테고리의 다른 글

cpp 데이터 TIP  (0) 2021.09.05
cpp const와 메모리 구조  (0) 2021.09.04
cpp 문자와 문자열  (0) 2021.08.17
cpp 불리언과 실수  (0) 2021.08.16
cpp 정수  (0) 2021.08.15