💡비트마스크 : 집합의 요소들의 구성 여부를 표현할 때 유용한 테크닉
DP나 순열 등, 배열 활용만으로 해결할 수 없는 문제
작은 메모리와 빠른 수행시간으로 해결이 가능 (But, 원소의 수가 많지 않아야 함)
집합을 배열의 인덱스로 표현할 수 있음
코드가 간결해짐
컴퓨터에서 사용되는 데이터의 최소 단위 (0과 1)
2진법을 생각하면 편하다.
예시) 9 (10진수) -> 1001 (2진수)
0과 1로, flag 활용하기
[1, 2, 3, 4, 5] 라는 집합이 있다고 가정해보자.
여기서 임의로 몇 개를 골라 부분집합을 만든다고 해보자.
여기서 비트마스킹을 이용하면, 각 요소를 인덱스처럼 표현하여 효율적인 접근이 가능하다.
[1, 2, 3, 4, 5] -> 11111
[2, 3, 4, 5] -> 11110
[1, 2, 5] -> 10011
[2] -> 00010
집합의 i번째 요소가 존재하면 1
, 존재하지 않으면 0
을 의미하는 것이다.
AND, OR, XOR, NOT, SHIFT
AND(&) : 대응하는 두 비트가 모두 1일 때, 1 반환
OR(|) : 대응하는 두 비트 중 모두 1이거나 하나라도 1일때, 1 반환
XOR(^) : 대응하는 두 비트가 서로 다를 때, 1 반환
NOT(~) : 비트 값 반전하여 반환
SHIFT(>>, <<) : 왼쪽 혹은 오른쪽으로 비트 옮겨 반환
현재 이진수로 10101
로 표현되고 있을 때, 3번째 비트 값을 1로 변경하려고 한다.
변경 후에는 11101
이 나와야 한다. 이때는 OR연산을 활용한다.
10101 | 1 << 3
현재 이진수로 11101
로 표현되고 있을 때, 3번째 비트 값을 0로 변경하려고 한다.
변경 후에는 10101
이 나와야 한다. 이때는 AND연산과 NOT연산을 활용한다.
11101 & ~1 << 3
현재 이진수로 10101
로 표현되고 있을 때, i번째 비트 값을 확인하려고 한다.
이때는 AND연산을 활용한다.
10101 & 1 << i