비트마스크
정수의 이진수 표현(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);
}
digit separator
C++11 부터는 digit separator 로 자릿수 구분이 쉬워졌다.
작은 따옴표를 중간에 넣어서 가독성을 높여준다.
int x = 0b1000'0011
int y = 1'000'000
Reference
'알고리즘' 카테고리의 다른 글
[ps] 알고리즘 문제 풀 때, 메모리 제한? (feat. 구조체 메모리 계산) (0) | 2021.08.02 |
---|---|
재귀(Recusion) 함수? 재귀 호출(Recusive Call)? (0) | 2021.07.24 |
완전탐색 기법이란? (0) | 2021.07.24 |
[Hash] 문자열 Hash 고찰 (2) | 2021.06.12 |
문자열 Hash (djb2) (0) | 2021.06.12 |
댓글