기본 연산
| 연산 | 의미 | |
|---|---|---|
a & b | 둘 다 1인 비트 | |
| `a \ | b` | 하나라도 1 |
a ^ b | 다르면 1 (XOR) | |
~a | 비트 반전 (언어별 폭 주의) | |
a << k | 왼쪽으로 k비트 (×2^k 감각) | |
a >> k | 오른쪽 시프트 |
JS는 비트 연산 전 32비트 정수로 취급하는 경우가 많습니다. 큰 정수·부호에 주의하세요.
플래그 패턴
const ON = 1 << 0;
const VIP = 1 << 1;
let flags = 0;
flags |= ON; // 켜기
flags &= ~ON; // 끄기
flags ^= VIP; // 토글
(flags & VIP) !== 0; // 검사
집합을 비트마스크로 표현하면 n≤20 완전탐색(부분집함)에 쓰입니다.
자주 쓰는 트릭
x & 1: 홀수?x & (x-1): 가장 낮은 1비트 제거x & -x: 가장 낮은 1비트만 (2의 보수)
XOR로 “짝수 번 나온 것 제외 하나 찾기”도 전형입니다.
언제 쓰나
- 상태 압축 DP
- 권한/옵션 플래그
- 저수준 최적화·퍼즐
일반 배열·해시로 충분한 문제에서는 무리해서 쓰지 마세요.
체크리스트
- 언어의 정수 폭·부호를 아는가?
- 마스크 상수에 이름을 달았는가?
- 시프트 횟수가 폭을 넘지 않는가?
연습
0..n-1 비트를 켜서 부분집합을 순회하는 이중 루프 스케치를 의사코드로 적어 보세요.
한 줄
> 비트는 작은 집합·플래그용. 가독성이 떨어지면 배열로.
관련 태그 문제로 바로 연습해 두면 읽기가 남습니다.
손계산
5는 101, 3은 011. 5 & 3 = 001 (1), 5 | 3 = 111 (7), 5 ^ 3 = 110 (6).
한 줄로 그려 보고 코드와 맞춰 보세요.