연습장
비트 연산과 비트 플래그 본문
주제: 비트 연산과 비트 플래그
비트 연산
비트연산이 언제 필요한가?
사용 빈도가 높진 않지만 아주 가끔 사용된다.
비트 단위의 조작이 필요할 때 (게임 서버에서 아이디를 만들 때
비트플래그(대표적)
~ 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