연습장

비트 연산과 비트 플래그 본문

언리얼 개발자/C++

비트 연산과 비트 플래그

도다람 2022. 8. 7. 21:32

주제: 비트 연산과 비트 플래그


비트 연산

 

비트연산이 언제 필요한가?

사용 빈도가 높진 않지만 아주 가끔 사용된다.

비트 단위의 조작이 필요할 때 (게임 서버에서 아이디를 만들 때

비트플래그(대표적)

 

~ bitwise not 단일 숫자의 모든 비트를 대상으로 0은 1, 1은 0
모든 비트를 거꾸로 뒤집는다.
& bitwise and 두 숫자의 모든 비트 쌍을 대상으로 and를 한다.
두 숫자가 1이면 1
| bitwise or 두 숫자의 모든 비트 쌍을 대상으로 or를 한다.
둘 다 0이 아니면 1
^ bitwise xor 두 숫자의 모든 비트 쌍을 대상으로 xor을 한다.
두 숫자가 같으면 0 다르면 1

같은 숫자 두개를 xor 연산 해주면 모든 비트가 0000 0000 으로 나온다.

 

 


비트 시프트

<< 비트 좌측 이동
비트열을 n만큼 왼쪽으로 이동
왼쪽의 넘치는 n개의 비트는 버린다.
생성되는 오른쪽의 n개의 비트는 0
곱하기2를 할 때 자주 보이는 패턴
 
>> 비트 우측 이동 좀 더 까다로움
비트열을 n만큼 오른쪽으로 이동
오른쪽의 넘치는 n개의 비트는 버린다.
생성되는 왼쪽의 n개의 비트는 부호비트가 존재할 경우
부호비프를 따라간다. (부호있는 정수라면 이 부분을 유의)
부호비트가 없다면 0 (대부분의 경우)

C++에서 부호가 있다는 의미는 일반적인 숫자를 말하며, 언싸인드가 아닌 경우에는 부호비트가 있는 숫자이다.

 

 


비트 플래그

특징: 불리언 노가다를 막을 수 있다.

 

실습:  롤을 모작한 짝퉁게임을 하나 만들었다.

그 게임에는 이상상태가 여러가지 있다.

일단 4가지 상태만 있다고 가정한다.

0b0000 [무적], [변이], [스턴], [공중부양]

게임에서는 4가지 상태가 동시에 걸릴 수 있다고 가정한다.

비트플래그를 사용하지 않고 bool stunned; 으로 상태를 하나씩 정의하며 코딩할수도 있지만

상태가 많아지면 이는 노가다이다.

=> 정수 사용

#include <iostream>
using namespace std;

unsigned char flag; //부호를 없애야 >>를 해도 부호비트가 딸려오지 않음

int main(){
	
    //무적상태로 만든다.
    flag = (1 << 3); //1 숫자를 왼쪽으로 3칸 시프트 = 8
    
    //변이상태를 추가한다.
    flag |= (1 << 2);
    
    //무적인지 확인(다른 상태는 관심없음)
    //bitmask 가면을 씌워서 원하는 부분을 추출
    bool invincible = (flag & (1 <<3)) != 0);
    
    //무적이거나 스턴 상태인지 확인
    bool stunOrInvincible = ((flag & 0b1010) != 0);

}

'언리얼 개발자 > C++' 카테고리의 다른 글

유의사항 및 팁  (0) 2022.09.05
const와 메모리 구조  (0) 2022.09.05
비교 연산과 논리 연산  (0) 2022.08.01
산술 연산(데이터 연산)  (0) 2022.07.31
문자와 문자열  (0) 2022.07.31
Comments