math
CHAPTER 12 / 15
읽기 약 2분
FUNCTION
비트 연산: 0과 1의 마법
핵심 개념
비트 단위 AND·OR·XOR·NOT·시프트 — 권한 플래그(chmod)·RGB 추출·짝수/홀수 판별 등 실전 활용.
본문
비트 연산 6종
| 연산 | 기호 | 동작 |
|---|---|---|
| AND | & | 두 비트 모두 1일 때만 1 |
| OR | | | 둘 중 하나라도 1이면 1 |
| XOR | ^ | 두 비트가 다를 때만 1 |
| NOT | ~ | 비트 반전 |
| Left Shift | << | 왼쪽으로 이동 (×2) |
| Right Shift | >> | 오른쪽으로 이동 (÷2) |
비트 연산 시각화
# 8비트 표현으로 보기
def bin8(n):
return bin(n & 0xFF)[2:].zfill(8)
a = 0b1100 # 12
b = 0b1010 # 10
print(f" a = {bin8(a)} ({a})")
print(f" b = {bin8(b)} ({b})")
print(f"a & b = {bin8(a & b)} ({a & b}) # AND")
print(f"a | b = {bin8(a | b)} ({a | b}) # OR")
print(f"a ^ b = {bin8(a ^ b)} ({a ^ b}) # XOR")
print(f" ~a = {bin8(~a)} ({~a}) # NOT (2의 보수)")
print(f"a << 1 = {bin8(a << 1)} ({a << 1}) # << 1 (×2)")
print(f"a >> 1 = {bin8(a >> 1)} ({a >> 1}) # >> 1 (÷2)")
# 결과:
# a = 00001100 (12)
# b = 00001010 (10)
# a & b = 00001000 (8)
# a | b = 00001110 (14)
# a ^ b = 00000110 (6)
# ~a = 11110011 (-13)
# a << 1 = 00011000 (24)
# a >> 1 = 00000110 (6)실전 1 — Linux 권한 (chmod)
# Linux 파일 권한은 9비트 (사용자/그룹/타인 × rwx)
# rwx = 4+2+1 = 7
# 비트마스크 정의
READ = 0b100 # 4
WRITE = 0b010 # 2
EXECUTE = 0b001 # 1
def add_permission(current, perm):
return current | perm # OR — 비트 켜기
def remove_permission(current, perm):
return current & ~perm # AND NOT — 비트 끄기
def has_permission(current, perm):
return (current & perm) == perm
# rwx (모든 권한)
perms = READ | WRITE | EXECUTE
print(bin(perms)) # 0b111 = 7
# 쓰기 제거
perms = remove_permission(perms, WRITE)
print(bin(perms)) # 0b101 = 5 (r-x)
# 읽기 권한 확인
print(has_permission(perms, READ)) # True
print(has_permission(perms, WRITE)) # False실전 2 — RGB 색상 추출
# RGB 색상은 24비트 (R 8비트 + G 8비트 + B 8비트)
# 0xRRGGBB 형태
def hex_to_rgb(color):
"""0xFF6B35 → (255, 107, 53)"""
r = (color >> 16) & 0xFF # 상위 8비트
g = (color >> 8) & 0xFF # 중간 8비트
b = color & 0xFF # 하위 8비트
return r, g, b
def rgb_to_hex(r, g, b):
"""(255, 107, 53) → 0xFF6B35"""
return (r << 16) | (g << 8) | b
print(hex_to_rgb(0xFF6B35)) # (255, 107, 53)
print(hex(rgb_to_hex(255, 107, 53))) # '0xff6b35'
# 색상 반전 (XOR)
def invert_color(color):
return color ^ 0xFFFFFF
print(hex(invert_color(0xFF6B35))) # '0x94caa' = 보색실전 3 — 짝수/홀수 판별
# n이 홀수면 마지막 비트가 1, 짝수면 0
def is_odd(n):
return (n & 1) == 1
def is_even(n):
return (n & 1) == 0
for i in range(10):
print(f"{i}: {'홀수' if is_odd(i) else '짝수'}")
# 0: 짝수
# 1: 홀수
# 2: 짝수
# ...
# 일반적인 % 2 보다 약 2~5배 빠름 (CPU 비트 연산이 나눗셈보다 빠름)
import time
n = 100_000_000
t0 = time.perf_counter()
for i in range(n):
_ = i & 1
print(f"비트: {(time.perf_counter() - t0)*1000:.1f}ms")
t0 = time.perf_counter()
for i in range(n):
_ = i % 2
print(f" %: {(time.perf_counter() - t0)*1000:.1f}ms")실전 4 — 비트마스크로 옵션 플래그
# 멀티 옵션 — 비트 위치마다 의미 부여
class Flag:
NONE = 0b00000
BOLD = 0b00001
ITALIC = 0b00010
UNDERLINE = 0b00100
STRIKE = 0b01000
BLINK = 0b10000
def render(text, flags):
parts = []
if flags & Flag.BOLD:
parts.append('B')
if flags & Flag.ITALIC:
parts.append('I')
if flags & Flag.UNDERLINE:
parts.append('U')
if flags & Flag.STRIKE:
parts.append('S')
return f"{','.join(parts)}: {text}"
# 굵게 + 기울임
print(render("Hello", Flag.BOLD | Flag.ITALIC))
# B,I: Hello
# 굵게 + 밑줄 + 취소선
print(render("Test", Flag.BOLD | Flag.UNDERLINE | Flag.STRIKE))
# B,U,S: Test다음 챕터
CH.13 "카르노 맵" — 복잡한 논리식을 시각적으로 단순화하는 도구.
AI 프롬프트
🤖 AI에게 잘 물어보는 법 — 모델·전략별 프롬프트
Claude
무료: Sonnet 4.6 / Pro $20/mo: Opus 4.6
내 코드에서 boolean 플래그들을 비트마스크로 통합 가능한 위치와 메모리 절감 효과를 분석해줘.
ChatGPT
무료: GPT-5.5 / Plus $20/mo: GPT-5.5 Pro
리눅스/유닉스 시스템의 권한 모델과 Windows ACL 비교를 비트 연산 관점에서 알려줘.
Gemini
무료: 2.5 Flash / Pro $19.99/mo: 3.1 Pro
내 데이터에서 비트 연산으로 처리 가능한 패턴(체크섬/해시/플래그)을 찾고 성능 향상 시뮬레이션을 보고해줘.
Grok
무료: Grok 4.1 / SuperGrok $30/mo
2026년 임베디드/IoT/게임 분야에서 비트 연산 사용 빈도와 일반 웹/앱 차이를 실무 관점에서 솔직히 알려줘.
⭐ 이것만 기억하세요
비트 연산: 0과 1의 마법은 이 3가지만 확실히 잡으세요
1.비트 연산은 0과 1 단위 AND/OR/XOR — 일반 boolean 연산을 32~64개 묶음으로 한꺼번에 처리
2.Linux chmod·RGB 색상·플래그·체크섬·암호 — 실전에서 비트 연산이 가장 효과적인 분야
3.다음 챕터 CH.13에서 카르노 맵 — 4변수 이상 논리식을 시각적으로 최소화하는 도구
공유하기
진행도 12 / 15