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: 전혀 없는지 확인