전체 코드

#include <iostream>
using namespace std;

unsigned char flag = 0;

int main()
{
    const unsigned char INVINCIBLE = (1 << 3);
    const unsigned char MUTATION = (1 << 2);
    const unsigned char STUN = (1 << 1);
    const unsigned char FLYING = (1 << 0);

    flag |= INVINCIBLE;
    flag |= MUTATION;

    bool invincible = (flag & INVINCIBLE) != 0;
    bool stunOrInvincible = (flag & (INVINCIBLE | STUN)) != 0;

    cout << "무적 상태: " << invincible << endl;
    cout << "무적 또는 스턴: " << stunOrInvincible << endl;

    return 0;
}


🧩 1️⃣ 비트 연산이란?

비트 단위로 직접 데이터를 조작하는 연산입니다.
정수의 이진수 형태를 직접 다루므로, 하드웨어 제어·플래그 관리·성능 최적화에 필수적입니다.

연산자이름설명대표 예시
~비트 NOT모든 비트를 반전 (0 ↔ 1)~a
&비트 AND둘 다 1일 때만 1a & b
|비트 OR둘 중 하나라도 1이면 1a | b
^비트 XOR서로 다를 때만 1a ^ b
<<좌측 시프트비트를 N칸 왼쪽 이동a << 2
>>우측 시프트비트를 N칸 오른쪽 이동a >> 2

🛠️ 2️⃣ 비트 연산 실습 예제

비트 NOT

unsigned char x = 0b10101010;
x = ~x;   // 0b01010101 (비트 반전)

비트 AND

unsigned char x = 0b10101010;
unsigned char y = 0b11001100;
unsigned char result = x & y;   // 0b10001000

비트 OR

unsigned char x = 0b10101010;
unsigned char y = 0b11001100;
unsigned char result = x | y;   // 0b11101110

비트 XOR

unsigned char x = 0b10101010;
unsigned char y = 0b11001100;
unsigned char result = x ^ y;   // 0b01100110

좌측 시프트

unsigned char x = 0b00000001;
x = x << 3;   // 0b00001000 (8)

우측 시프트

unsigned char x = 0b00001000;
x = x >> 2;   // 0b00000010 (2)

⚔️ 3️⃣ 비트 플래그 (Bit Flag)

✔️ 비트 플래그란?

  • 상태를 여러 개의 비트로 표현하는 기법
  • 1비트는 on/off (true/false)
  • 한 변수에 최대 8개의 상태 저장 가능 (unsigned char의 경우)

✔️ 비트 플래그 예제 코드 (상태 관리)

unsigned char flag = 0; // 초기 상태 없음

// 상태 정의
const unsigned char INVINCIBLE = (1 << 3);  // 무적
const unsigned char MUTATION = (1 << 2);     // 변이
const unsigned char STUN = (1 << 1);         // 스턴
const unsigned char FLYING = (1 << 0);       // 공중부양

// 무적 상태 켜기
flag |= INVINCIBLE;

// 변이 상태 추가
flag |= MUTATION;

// 무적인지 확인
bool isInvincible = (flag & INVINCIBLE) != 0;

// 무적+스턴 체크
bool isStunOrInvincible = (flag & (INVINCIBLE | STUN)) != 0;

💻 4️⃣ 디어셈블리 분석 (비트 연산 명령어 매핑)

C++ 연산어셈블리
x = ~xnot x
x = x & yand x, y
x = x \| yor x, y
x = x ^ yxor x, y
x = x << 3shl x, 3
x = x >> 2shr x, 2

🎮 5️⃣ 비트 플래그 디버깅 흐름 예제 (무적 상태 설정)

flag = (1 << 3);

디어셈블리 매핑

mov byte ptr [flag], 8    ; 1 << 3 = 8 저장

변이 상태 추가

flag |= (1 << 2);
movzx eax, byte ptr [flag]
or eax, 4                   ; 1 << 2 = 4
mov byte ptr [flag], al

무적 상태 체크

bool invincible = ((flag & (1 << 3)) != 0);
movzx eax, byte ptr [flag]
and eax, 8                   ; 1 << 3
test eax, eax

무적 또는 스턴 체크

bool stunOrInvincible = ((flag & ((1 << 3) | (1 << 1))) != 0);
movzx eax, byte ptr [flag]
and eax, 0xA                 ; 0b1010 = (1 << 3) | (1 << 1)
test eax, eax

📊 6️⃣ 비트 플래그 구조 시각화

비트 위치76543 (무적)2 (변이)1 (스턴)0 (공중부양)
상태 값00001100
  • 무적과 변이만 켜진 상태

📚 7️⃣ 학습 체크포인트

✅ 비트 연산은 메모리 절약 & 성능 극대화에 필수
✅ 비트 플래그는 다양한 상태를 "압축 관리"하는 필살기
✅ 디어셈블리 보면 비트 연산이 얼마나 가볍고 빠른지 체감 가능
✅ unsigned 타입 사용 필수 (부호 비트 오염 방지)
flag 값 변화 과정 디버깅하며 흐름 감각 잡기
✅ 디스어셈블리 직접 확인하는 연습 꼭 하기 (Ctrl+Alt+D)


🔥 9️⃣ 마무리 요약

포인트내용
성능비트 연산은 최고 효율 연산
상태 관리플래그로 여러 상태를 1바이트로 관리
디버깅 포인트비트 마스크 값 변화 추적
디어셈블리 확인실제 명령어 흐름 확인 필수

이 자료로 비트 연산과 비트 플래그는 끝장내셨습니다.
📚 다음 강의 주제도 필요하신가요?
✨ 추가 심화 내용이 궁금하면 말씀주세요!
🔥 비트마스크 활용 예제 더 드릴까요?
궁금한 거 끝까지 다 해결해드립니다. 💪😊

profile
李家네_공부방

0개의 댓글