CPP 비트플래그 연산 과정
1. 단일 상태 확인
// 0b0000 [무적][기절][변이][속박]
// bit: 3 2 1 0
unsigned int flag = 0b1010; // 무적 + 변이 상태
bool isInvincible = (flag & INVINCIBLE) != 0;
비트 연산 과정:
flag: 1010 (무적=1, 기절=0, 변이=1, 속박=0)
INVINCIBLE: 1000 (3번 비트만 1)
-----------
flag & INVINCIBLE: 1000 (AND 연산)
1000 != 0 → true
!= 0 을 쓰는 이유
- AND 결과가 0이 아니면 해당 비트가 켜져있다는 뜻
- AND 결과가 0이면 해당 비트가 꺼져있다는 뜻
2. 여러 상태 중 하나라도 확인 (OR 조건)
bool isImmuneToAttack = (flag & (INVINCIBLE | POLYMORPH)) != 0;
단계별 계산:
1단계: INVINCIBLE | POLYMORPH
INVINCIBLE: 1000
POLYMORPH: 0010
-----------
OR 결과: 1010 (마스크 생성)
2단계: flag & 마스크
flag: 1010
마스크: 1010
-----------
AND 결과: 1010
3단계: 결과 확인
1010 != 0 → true (무적 또는 변이 상태가 있음)
다른 예제:
flag = 0b0100; // 기절 상태만
bool isImmuneToAttack = (flag & (INVINCIBLE | POLYMORPH)) != 0;
flag: 0100
마스크: 1010
-----------
AND 결과: 0000
0000 == 0 → false (무적도 변이도 아님)
3. 특정 상태 조합이 모두 있는지 확인 (AND 조건)
bool isStunnedAndBound = (flag & (STUN | BIND)) == (STUN | BIND);
완전한 조합 확인:
flag = 0b0101; // 기절 + 속박 상태
1단계: STUN | BIND (마스크 생성)
STUN: 0100
BIND: 0001
-----------
마스크: 0101
2단계: flag & 마스크
flag: 0101
마스크: 0101
-----------
AND 결과: 0101
3단계: 완전 일치 확인
0101 == 0101 → true (기절과 속박 둘 다 있음)
부분 일치하는 경우:
flag = 0b0100; // 기절만 있고 속박은 없음
flag: 0100
마스크: 0101
-----------
AND 결과: 0100
0100 != 0101 → false (기절은 있지만 속박이 없음)
자주 쓰는 패턴
패턴 1: 최소 하나라도 있으면
// 어떤 디버프라도 있으면 치료 아이템 사용 가능
unsigned int debuffMask = STUN | BIND | POLYMORPH;
bool canUseCureItem = (flag & debuffMask) != 0;
패턴 2: 정확히 이 조합만
// 정확히 무적+기절 상태일 때만 특수 스킬 사용 가능
unsigned int requiredCombo = INVINCIBLE | STUN;
bool canUseSpecialSkill = (flag & requiredCombo) == requiredCombo;
패턴 3: 특정 상태가 없어야 함
// 기절 상태가 아닐 때만 이동 가능
bool canMove = (flag & STUN) == 0;
// 디버프가 하나도 없을 때만 버프 사용 가능
unsigned int debuffMask = STUN | BIND | POLYMORPH;
bool canUseBuff = (flag & debuffMask) == 0;
복잡한 조건 예제
// 무적이 아니면서 (기절 또는 속박) 상태인가?
bool isVulnerableAndDisabled =
(flag & INVINCIBLE) == 0 && // 무적이 아님
(flag & (STUN | BIND)) != 0; // 기절 또는 속박
// 변이 상태이면서 다른 디버프는 없는가?
bool isOnlyPolymorphed =
(flag & POLYMORPH) != 0 && // 변이 상태임
(flag & (STUN | BIND)) == 0; // 다른 디버프는 없음
디버깅 팁
비트 상태 출력하기:
void printStatus(unsigned int flag) {
cout << "상태: ";
if (flag & INVINCIBLE) cout << "무적 ";
if (flag & STUN) cout << "기절 ";
if (flag & POLYMORPH) cout << "변이 ";
if (flag & BIND) cout << "속박 ";
if (flag == 0) cout << "정상";
cout << endl;
// 비트 패턴도 출력
cout << "비트: " << bitset<4>(flag) << endl;
}
결론:
!= 0
: 하나라도 있는지 확인== 마스크
: 정확히 조합이 맞는지 확인== 0
: 전혀 없는지 확인