전체 코드
#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일 때만 1 | a & b |
| | | 비트 OR | 둘 중 하나라도 1이면 1 | a | b |
| ^ | 비트 XOR | 서로 다를 때만 1 | a ^ b |
| << | 좌측 시프트 | 비트를 N칸 왼쪽 이동 | a << 2 |
| >> | 우측 시프트 | 비트를 N칸 오른쪽 이동 | a >> 2 |
🛠️ 2️⃣ 비트 연산 실습 예제
비트 NOT
unsigned char x = 0b10101010;
x = ~x;
비트 AND
unsigned char x = 0b10101010;
unsigned char y = 0b11001100;
unsigned char result = x & y;
비트 OR
unsigned char x = 0b10101010;
unsigned char y = 0b11001100;
unsigned char result = x | y;
비트 XOR
unsigned char x = 0b10101010;
unsigned char y = 0b11001100;
unsigned char result = x ^ y;
좌측 시프트
unsigned char x = 0b00000001;
x = x << 3;
우측 시프트
unsigned char x = 0b00001000;
x = x >> 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 = ~x | not x |
x = x & y | and x, y |
x = x \| y | or x, y |
x = x ^ y | xor x, y |
x = x << 3 | shl x, 3 |
x = x >> 2 | shr 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️⃣ 비트 플래그 구조 시각화
| 비트 위치 | 7 | 6 | 5 | 4 | 3 (무적) | 2 (변이) | 1 (스턴) | 0 (공중부양) |
|---|
| 상태 값 | 0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
📚 7️⃣ 학습 체크포인트
✅ 비트 연산은 메모리 절약 & 성능 극대화에 필수
✅ 비트 플래그는 다양한 상태를 "압축 관리"하는 필살기
✅ 디어셈블리 보면 비트 연산이 얼마나 가볍고 빠른지 체감 가능
✅ unsigned 타입 사용 필수 (부호 비트 오염 방지)
✅ flag 값 변화 과정 디버깅하며 흐름 감각 잡기
✅ 디스어셈블리 직접 확인하는 연습 꼭 하기 (Ctrl+Alt+D)
🔥 9️⃣ 마무리 요약
| 포인트 | 내용 |
|---|
| 성능 | 비트 연산은 최고 효율 연산 |
| 상태 관리 | 플래그로 여러 상태를 1바이트로 관리 |
| 디버깅 포인트 | 비트 마스크 값 변화 추적 |
| 디어셈블리 확인 | 실제 명령어 흐름 확인 필수 |
이 자료로 비트 연산과 비트 플래그는 끝장내셨습니다.
📚 다음 강의 주제도 필요하신가요?
✨ 추가 심화 내용이 궁금하면 말씀주세요!
🔥 비트마스크 활용 예제 더 드릴까요?
궁금한 거 끝까지 다 해결해드립니다. 💪😊