내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리 처리한다. 이와 같은 특성을 이용해 정수의 이진수 표현을 자료 구조로 쓰는 기법을 비트마스크(bitmask)라고 부른다.
a & b
a | b
a ^ b
~a
a << b
a >> b
1
은 부호 있는 32비트 상수로 취급하기 때문에 오버플로우가 발생할 수 있다. 따라서 1ull
을 사용한다.비트마스크의 가장 중요한 사용 사례는 집합을 구하는 것이다.
공집합과 꽉 찬 집합 구하기
int fullPizza = (1 << 20) - 1
원소 추가
toppings |= (1 << p)
원소의 포함 여부 확인
toppings & (1 << p )
원소 삭제
toppings &= ~(1 << p)
원소 토글
toppings ^= (1 << p)
합집합
(a | b)
교집합
(a & b)
차집합
(a & ~b)
a와 b중 하나에만 포함되는 원소의 집합
(a ^ b)
집합의 크기
__popcnt(toppings)
__builtin_popcount(toppings)
최소 원소 찾기
_BitScanForward(&index, toppings)
최소 원소 지우기
toppings &= (toppings - 1)
모든 부분 집합 순회하기
주어진 집합의 모든 부분 집합을 순회하기
for(int subset = pizza; subset; subset=((subset - 1) & pizza){
//subset은 pizza의 부분집합
}