즉, 이진수를 이용해서 하나의 숫자로 Boolean Array 을 표현할 수 있습니다.
처음 제가 비트마스킹 강의를 들었을 때 이랬습니다..
저도 그래서 다시 정리해봅니다..
아래 내용들을 다 보시면 어느정도 감이 잡히실겁니다.
void bitmasking() {
int n = 15;
int idx = 0;
n &= ~(1 << idx);
cout << "idx번째 비트 0 만들기 : " << n << '\n';
//before 011011
//after 011010
}
void bitmasking() {
int n = 5; //1001
int idx = 1;
n ^= (1 << idx);
cout << "idx번째 XOR 연산 : " << n << '\n';
//before 1001
//after 1011
}
void bitmasking() {
int n = 6;
int idx = (n & -n);
cout << "최하위 비트 찾기 : " << idx << '\n';
// 0110 1000
// idx = 2 idx = 8
}
void bitmasking() {
int n = 4;
cout << "크기가 n인 집합의 모든 비트 켜기 : " << (1 << n) - 1 << '\n';
// before 0100 = 4
// after 1111 = 15
}
void bitmasking() {
int n = 8;
int idx = 2;
n |= (1 << idx);
cout << "idx번째 비트 1로 만들기 : " << n << '\n';
// before 1000 = 8
// after 1100 = 12
}
void bitmasking() {
int n = 15;
int idx = 0;
string s = n & (1 << idx) ? "yes" : "no";
cout << "idx번째 비트가 1인가? : " << s << '\n';
// 1111 = 15
// yes 출력
}
예시로 저는 BFS/DFS 문제들에서 방문한 지역을
bool vst[1004]와 같은 Boolean 배열로 체크를 해주었습니다.
반면, 비트마스킹은 Boolean 배열의 역할 을 하는 "하나의 숫자" 를 만들어서 "비트 연산자"를 통해 탐색, 수정 등의 작업 을 하는 것을 의미합니다.
비트마스킹으로 경우의 수를 표현할 수 있습니다.
예를들어 { "A", "B", "C", "D"} 를 조합하는 모든 경우의 수를 구해봅시다.
A
B
AB
ABC
....... 등등
4가지의 원소로는 16가지의 경우의 수가 나올 것 입니다.
#include<iostream>
using namespace std;
int main(){
int n = 4;
string s[n] = {"A", "B", "C", "D"};
for(int i = 0; i < (1 << n); i++){
string ret = "";
for(int j = 0; j < n; j++){
if(i & (1 << j)){
ret += s[j];
}
}
cout << ret << '\n';
}
return 0;
}
/*
A
B
AB
C
AC
BC
ABC
D
AD
BD
ABD
CD
ACD
BCD
ABCD
*/
추천문제
Reference