idx번째 비트끄기 | S &= ~(1≪idx) |
idx번째에 대한 XOR연산 | S ^= (1≪idx) |
최하위 켜져있는 idx 찾기 | idx = (S&-S) |
n인 집합의 모든 비트를 켜기 | (1≪n)-1 |
idx번째 비트켜기 | S != (1≪idx) |
idx번째 비트가 있는지 확인하기 | if(S&(1≪idx)) |
const t1 = (t) => {
let idx = 0;
let temp = t;
// ~ : 비트를 뒤집는다
// 1<<0 -> 1 001
// ~001 = 100
// 5 & ~1 = 101 & 100 = 100 => 4
temp &= ~(1<<idx);
console.log(`불좀꺼줄래 T1: ${temp}\n`);
}
t1(5); // temp값 4 출력
// 1<<0 === 001
// 5 ^ 1 -> 101^001 === 100 = 4
const t2 = (t) => {
let idx = 0;
let temp = t;
temp ^= (1<<idx);
console.log(`XOR T2: ${temp}\n`);
}
t1(5); // temp값 4 출력
// t=5인경우 101 1인 최하위의 인덱스인 2^0 = 1 출력
// t=4인경우 100 1인 최하위의 인덱스인 2^1 = 4 출력
const t3 = (t) => {
let idx = (t&-t);
console.log(`최하위 켜져있는 인덱스 T3: ${idx}\n`);
}
const t4 = (t) => {
let n = t;
console.log(`크기가 n인 모든 집합의 모든 비트켜기 T4: ${(1<<n)-1}\n`)
}
const t5 = (t) => {
let idx = 1;
let temp = t;
temp |= (1<<idx);
console.log(`idx번째 불켜기 T5: ${temp}`);
}
const t6 = (t) => {
let idx = 0;
let temp = t;
let a = temp & (1<<idx) ? 'yes':'no';
console.log(`idx번째 비트가 있는지 확인하기 T6: ${a}\n`)
}
1 : 1
2 : 10
3 : 11
4 : 100
2진수는 아래의 2진수가 그 범위를 침범하지 못하는 성질을 이용하면 마친 2진수 자체의 비트를 하나의 배열에 있는 요소처럼 쓸 수 있음.
즉, 101은 1과 4의 합집합, 111은 1과 2와 4의 합집합
이로써 배열의 효과를 지니면서 매번 배열 전체를 탐색하지 않아도 &연산 하나로 이 집합에 포함되어 있음을 알 수 있음.
예를 들어, let a = {1,1,0}이라고 할 때 2번째 요소에 값이 들어있나? 확인하려면 for문을 통해 확인 그러나 이를 2진수로 표현하면,
111(2) = 6
6 & 1 = 0
즉, AND연산으로 값을 조회 가능.
- DP(동적계획법)
- TSP(Traveling Salesman problem)
- 외판원 순회 문제의 약자로. 컴퓨터과학분야에서 가장 중요하게 취급되는 문제 중 하나.
- 삽입: OR연산, 삭제: AND,NOT연산, 조회: AND연산을 사용