일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- DeepLearning
- 알고리즘
- BFS
- ReLU
- Greedy
- 그래프
- Swift
- mysql
- 캡스톤정리
- sigmoid
- 부르트포스
- 탐색
- Docker
- 실버쥐
- Stack
- ios
- Blockchain
- Node.js
- 풀이
- dp
- dfs
- 백트래킹
- 프로그래머스
- 그리디
- 문제풀이
- Algorithm
- NeuralNetwork
- 백준
- 플로이드와샬
- C++
- Today
- Total
개발아 담하자
[Algorithm/C++] 비트마스크 (BitMask) 란? 본문
비트는 이진숫자(binary digit) 를 뜻하는 말로 컴퓨터에서 사용하는 데이터의 최소 단위를 의미합니다.
비트는 0/1 , true/false, on/off 상태를 나타낼 수 있습니다.
비트 마스크(BitMask) 는 이러한 비트의 형태를 활용해, 정수의 이진수를 표현을 활용하는 기법입니다.
예시
길이가 5인 집합 {0,1,2,3,4} 가 존재한다고 가정합니다.
우리는 여기서 몇 가지 요소를 뽑아 어떤 요소를 선택했는지 부분집합을 사용해 표현할 수 있습니다.
{ 1, 2, 3, 4 }, { 1, 2, 4 }, { 2, 4 }, { 1 } .......
위와 같은 형태로, Integer 형으로 인덱스를 활용할 수 있다면, 단순히 boolean 배열을 통해 구현할 수도 있습니다.
int[] array1 = [1, 1, 1, 1, 0];
int[] array2 = [1, 1, 0, 1, 0];
int[] array3 = [1, 0, 1, 0, 0];
하지만 위와 같은 형태는 메모리를 많이 차지해 오버헤드가 증가합니다.
이는 비트마스크를 통해 더욱 효율적이게 처리할 수 있습니다.
{ 0, 1, 2, 3, 4 } => 11111
{ 1, 2, 3, 4 } => 11110
{ 1, 2, 4 } => 10110
{ 2, 4 } => 10100
{ 1 } => 00010
위와 같은 표현 기법 (비트마스크) 는 각 요소를 인덱스처럼 표현합니다.
즉 집합 n번째 원소가 존재하면 1을, 그렇지 않으면 0을 반환합니다.
장점
1. 더 빠른 수행 시간을 보장합니다.
2. 더 간결한 코드를 제공합니다.
3. 메모리 사용량을 줄일 수 있습니다.
* 알고리즘 문제를 풀 때에는 원소의 수가 적을 경우에 유용합니다.
주의 사항
1. 연산자 우선 순위가 낮기 때문에 괄호를 치는 습관을 가지는 것이 좋습니다.
2. 1은 부호있는 32bit 상수로 취급하므로 32bit 가 넘어가는 수 표현에서는 오류가 날 수 있습니다.
3. 부호 있는 정수형에서 최상위 비트가 켜진 숫자는 음수를 표현합니다.
비트 연산
1. AND(&) : 대응하는 두 비트가 모두 1일 때에만 1 반환
2. OR(|) : 대응하는 두 비트가 모두 1이거나 하나라도 1일 경우 1 반환
3. XOR(^) : 대응하는 두 비트가 서로 다를 때 1 반환
4. NOT(~) : 비트 값을 전환하여 반환
5. SHIFT(>>, <<) : 왼쪽 혹은 오른쪽으로 비트를 옮겨 반환
'🌟 자료구조+알고리즘' 카테고리의 다른 글
[Algorithm/C++] 튜플(Tuple) 사용하기 (0) | 2021.02.15 |
---|---|
[Algorithm/C++] next_permutation, prev_permutation 사용해 순열 구하기 (0) | 2021.01.28 |
[Algorithm] Dynamic Programming (동적계획법) 이란? (0) | 2021.01.27 |
[Algorithm] 유전 알고리즘이란? (Genetic Algorithm) (0) | 2020.06.08 |
[Algorithm] 그리디 알고리즘이란? (활동 선택 문제, 분할 가능 배낭 문제) (0) | 2020.03.30 |