비트마스크
정수의 이진수 표현(Bit)을 자료 구조로 쓰는 기법
현대의 모든 CPU는 이진수를 이용해도 모든 자fy 표현
내부적으로 이진수를 사용하는 컴퓨터들은 이진법 관련 연산들을 아주 빨리 할 수 있다.
- 더 빠른 수행 시간
비트마스크를 활용하는 것이 원소의 수가 많지 않겠지만, 큰 속도 향상이 없을 수는 있다.
하지만 연산을 여러 번 수행할 때는 괴장히 효율적이다.
- 더 작은 공간 복잡도(메모리)
- 비트 연산자를 활용한 가독성(간결한 코드)
다양한 집합 연산들을 반복문 없이 사용
ex) 8개의 비트를 사용할 때, 아래와 같이 표현.
arr[8] = {1, 2, 4, 8, 16, 32, 64, 128}
arr[i] = 1 << i
int a[] = {0, 1, 2, 3, 4}
int a[] = {0, 1}
int a[] = {2, 3, 4}
{0, 1, 2, 3, 4} → 11111 → 31
{0, 1} → 11000 → 24
{2, 3, 4} → 00111 → 7
NOT 연산의 경우 자료형에 따라 결과가 달라집니다.
SHIFT 연산의 경우
주의사항
다양한 예시
원소 추가
0010 | (1 << 3)
0010 | 1000 = 1010
원소의 포함 여부 확인
{sample bit} & (1 << p) > 0
ex) 1011 & 0100 = 0000
ex) 0010 & 0010 = 0010 > 0
ex) if ({sample bit} & (1 << p)) cout << "There is 'p'th element" << endl;
원소 변경
{samplebit} &= ~(1 << p);
ex) 0010일 때, 3번째 비트 값을 0으로 변경해보기
0010 & ~ 1 << 1
0010 & 1101 = 0000
원소 찾기
최소 원소 지우기
원소 토글
모든 부분집합 순회하기
for (int subset = fullset; subset; subset = ((subset - 1) & fullset)) {
cout << subset << endl;
}
집합의 크기 구하기
각 비트를 순회하면서 켜져 있는 비트의 수를 셉니다.(재귀 호출 방식)
int bitcount(int x){
if (x == 0) return 0;
return x % 2 + bitcount(x / 2);
}
Reference
'알고리즘' 카테고리의 다른 글
[알고리즘] 코딩 테스트 문제 풀 때, 시간 복잡도 계산해보기 (2) | 2021.05.05 |
---|---|
[구간합] Sum of sub-matrix가 무엇이고, 어떻게 하는 것일까? (0) | 2021.05.03 |
힙 정렬 (Heap Sort) (0) | 2021.03.06 |
Binary Search (이분 탐색) (0) | 2021.03.06 |
계수 정렬(Counting Sort) (0) | 2021.03.06 |
댓글