-
[ Algorithm ] BitMask 비트마스크공부 !/Computer Science 2022. 4. 20. 21:55반응형
비트마스크
알고리즘 문제를 풀다보면 비트마스크의 개념을 알고 있으면 도움이 될 때가 있다 !
그렇다면 비트마스크는 무엇일까 ?!
컴퓨터의 최소 연산 단위는 bit 이다 내부적으로 모든 자료를 이진수로 표현한다
bit 는 이진수를 나타내기 위해 0과 1로 이루어져 있고
정수의 이진수 표현을 자료구조로 쓰는 기법을 비트 마스크라 한다
비트연산자
비트연산자에는 AND, OR, XOR, NOT, SHIFT 가 존재한다
AND (&)
# 대응하는 두 비트가 모두 1일 때 1을 반환한다 1010 & 1111 = 1010
OR (|)
# 대응하는 두 비트가 모두 1 또는 하나라도 1인 경우 1을 반환한다 1010 | 1111 = 1111
XOR (^)
# 대응하는 두 비트가 서로 다르면 1을 반환한다 1010^1111 = 0101
NOT (~)
# 비트의 값을 반전하여 반환한다 ~1010 = 0101
SHIFT (>>,<<)
# 왼쪽 Shift (<<): 왼쪽으로 비트를 옮긴다. (A * 2^B) # 오른쪽 Shift (>>): 오른쪽으로 비트를 옮긴다. (A / 2^B) 00001010 << 2 = 101000 00001010 >> 2 = 000010
비트마스크 활용
예를 들어 알고리즘에서 방문을 체크하는 리스트가 존재할 때
보통 리스트를 이용하여 아래와 같이 표현한다
vistied = [False]*10
비트마스킹으로 표현하면 아래와 같이 표현하고
각 비트는 하위주소 ( 오른쪽 ) 부터 인덱스를 세면 된다
visited = 0b0000000000
집합의 표현
비트 마스크를 이용하면 집합을 쉽게 표현할 수 있는데
원소를 추가, 삭제하는 등 다양한 연산을 굉장히 빠르게 수행할 수 있다
원소의 개수가 N 인 집합이 존재할 때 각 원소에 0부터 n-1 까지 번호를 부여하고
번호에 해당하는 비트가 1이면 원소가 포함, 0이면 불포함으로 집합을 표현할 수 있다
원소추가
# p번 원소를 추가 / p번 비트를 1로 바꾸어주면 된다 cur = cur|(1<<P)
원소삭제
# p번 원소를 삭제할 경우 비트를 0으로 바꾸어주면 된다 cur = cur&~(1<<p)
원소토글
# p번 비트가 1이면 0, 0이면 1로 바꾸는 토글 연산 cur = cur^(1<<p)
집합연산(합집합)
a|b # a와 b 의 합집합 a%b # a와 b 의 교집합 a&~b # a 에서 b를 뺀 차집합 a^b # a 와 b 중 하나에만 포함된 원소들의 집합
집합의 크기는 아래와 같이 재귀적으로 모든 비트를 순회하면서
현재 1로 켜져있는 비트의 수를 count 하면 된다
장점
- 비트 연산은 삽입, 삭제, 조회가 빠르다
- 코드가 간결해진다
- 빠른 속도 !
- 정수 표현으로 DP 문제를 해결할 수 있다
반응형'공부 ! > Computer Science' 카테고리의 다른 글
[ Algorithm ] 피보나치수열 알고리즘 비교 (재귀, DP, 반복) (0) 2022.04.22 [ Algorithm ] Sorting Algorithm 정렬 알고리즘 (0) 2022.04.21 [ Data Structure ] Heap 힙 & 우선순위 큐 (0) 2022.04.14 [ Data Structure ] Queue 큐 (0) 2022.04.14 [ Data Structure ] Stack 스택 (0) 2022.04.14