-
비트마스크 (BitMask)Algorithm 2020. 12. 9. 10:17
비트 연산 (Bitwise operation)
- & (and)
- | (or)
- ~ (not)
- ^ (xor)
not 연산의 경우에는 자료형에 따라 결과가 달라진다.
A = 83 = 0101,0011(2)
~A = 1010,1100(2) / 8비트 자료형인 경우
~A = 1111,1111 1111,1111 1111,1111 10101,100(2) / 32비트 자료형인 경우
Shift Operators
1. shift left (<<)
- A << B (A를 왼쪽으로 B만큼 민다)
1 << 0 = 1
1 << 1 = 10(2) = 2
1 << 2 = 100(2) = 4
1 << 3 = 1000(2) = 8
3 << 3 = 11000(2) = 24
5 << 10 = 1010000000000(2) = 5120
2. shift right (>>)
- A >> B (A를 오른쪽으로 B만큼 민다)
1 >> 0 = 1
1 >> 1 = 0(2) = 1
10 >> 1 = 101(2) = 5
10 >> 2 = 10(2) = 2
10 >> 3 = 1(2) = 1
30 >> 1 = 1111(2) = 15
1024 >> 10 = 1(2) = 10
A << B 는 A * 2^B 와 같다.
A >> B 는 A / 2^B 와 같다.
(A+B) / 2 는 (A+B) >> 1 로 쓸 수 있다.
비트 연산을 사용할 때는 연산자 우선 순위를 생각해야 한다.
#Q :1 << N -1
1. (1 << N) - 1
2. 1 << (N -1)
#A : 1 << (N - 1)
비트마스크
- 정수의 이진수 표현을 자료구조로 쓰는 기법
비트마스크의 장점
- 수행 시간이 빠르다.
- bit 연산이기 때문에 O(1)에 대부분 구현됨. 따라서 다른 자료구조를 이용하는 것보다 훨씬 빠르다.
- 비트의 개수만큼 원소를 다룰 수 있기 때문에 연산 횟수가 적은 경우에는 속도에 큰 차이가 없지만, 연산 횟수가 늘어날수록 차이가 매우 커지게 된다.
- 코드가 짧다.
- 메모리 사용량이 더 적다.
- ex) bit 가 10개인 경우에는 각 bit당 두 가지 경우를 가지기 때문에 2^10 가지의 경우를 10bit 이진수 하나로 표현이 가능하다.
- 이처럼 하나의 정수로 매우 많은 경우의 수를 표현할 수 있기 때문에 메모리 측면에서 효율적이며, 더 많은 데이터를 미리 계산해서 저장해 둘 수 있는 장점이 있다. (DP 에서 유용)
정수로 집합을 나타낼 수 있다.
{1, 3, 4, 5, 9} => 0101110001 => 2^1 + 2^3 + 2^4 + 2^5 + 2^9
- 보통 0부터 N-1 까지 정수로 이루어진 집합을 나타낼 때 사용한다.
- 0부터 N-1까지로 변형해서 사용하는 것이 더 좋다.
- 포함되어 있는지
- 추가하기
- 제거하기
- 토글하기
- 전체집합 (1 << N) - 1
- 공집합 0
현재 집합이 S 일때
i 를 검사 (and)
- S & (1 << i)
i 를 추가 (or)
- S | (1 << i)
i 를 제거 (not)
- S & ~(1 << i)
i 를 토글 (xor)
- S ^ (1 << i)
- 물론 배열을 사용하는 것이 더욱 편리하지만, 비트마스크를 사용하는 이유는 집합을 배열의 인덱스로 표현할 수 있기 때문이다.
- 상태 다이나믹을 할 때 자주 사용하게 된다.
# 연습문제 BOJ
11723 :: 집합
1182 :: 부분수열의 합
14889 :: 스타트와 링크
14391 :: 종이 조각
※ 출처
'Algorithm' 카테고리의 다른 글
위상정렬 정리 (0) 2021.06.26 자료구조 정리 (0) 2021.01.26 다이나믹 프로그래밍 정리 (0) 2020.09.09 트리 정리 (0) 2020.09.07 그리디&구현, DFS&BFS (0) 2020.09.01