비트마스킹 (Bit Masking)
비트마스킹은 정수를 이진수로 표현해서 특정 상태를 관리하는 기법이다.
보통 비트 연산자를 활용해서 데이터를 조작한다.
0b10101(십진수 21)처럼 이진수로 보면, 각각의 자리가 어떤 상태를 나타내는 플래그가 될 수 있다.
- 1 이면 "켜짐" (True, ..)
- 0 이면 "꺼짐" (Flase, ..)
📌 비트 연산자 정리
연산자 | 설명 | 예시 (A=0b1010, B=0b1100) | 결과 |
& (AND) | 둘 다 1이면 1 | A & B | 0b1000 (8) |
` | `(OR) | 하나라도 1이면 1 | `A |
^ (XOR) | 다르면 1, 같으면 0 | A ^ B | 0b0110 (6) |
~ (NOT) | 비트 반전 (1->0, 0->1) | ~A | 0b...11110101 (보수연산) |
<< (왼쪽 시프트) | 비트들을 왼쪽으로 이동 | A << 1 | 0b10100 (20) |
>> (오른쪽 시프트) | 비트들을 오른쪽으로 이동 | A >> 1 | 0b0101 (5) |
📌 비트마스킹 활용법 (기본)
1️⃣ 특정 원소 추가
bitmask = 0b000 # 초기 상태 (모두 꺼짐)
bitmask |= (1 << 2) # 2번 인덱스(세 번째 자리) 켜기
print(bin(bitmask)) # 0b100 (4)
2️⃣ 특정 원소 제거
bitmask = 0b1011 # 현재 상태: 0b1011 (십진수 11)
bitmask &= ~(1 << 1) # 1번 인덱스(두 번째 자리) 끄기
print(bin(bitmask)) # 0b1001 (9)
3️⃣ 특정 원소 토글 (ON <-> OFF 전환)
bitmask = 0b1010 # 0b1010 (십진수 10)
bitmask ^= (1 << 1) # 1번 인덱스(두 번째 자리) 토글
print(bin(bitmask)) # 0b1000 (8)
4️⃣ 특정 원소 확인
bitmask = 0b1010
print(bool(bitmask & (1 << 3))) # 3번 인덱스에 값이 있는지 확인 (True)
print(bool(bitmask & (1 << 2))) # 2번 인덱스에 값이 있는지 확인 (False)
📌 비트마스킹이 자주 쓰이는 곳
✅ 부분집합 구하기
✅ 집합(Set)처럼 활용하기
✅ 조합(Combination) 구하기
✅ 중복 체크, 방문 체크
✅ 상태 압축 DP
'알고리즘 > 개념' 카테고리의 다른 글
투포인터(Two Pointer) (1) | 2025.03.30 |
---|---|
슬라이딩 윈도우(Sliding Window) (0) | 2025.03.26 |