기본 패턴
c
unsigned int flags = 0;
flags |= 1u << 2;
flags &= ~(1u << 1);
if (flags & (1u << 2)) {
/* bit 2 is on */
}설명
- 비트 연산은 정수 값을 2진수 비트 단위로 직접 조작할 때 사용합니다.
- 플래그를 여러 개 한 변수에 모으거나, 레지스터 비트를 켜고 끄는 코드에서 특히 자주 보입니다.
- 시프트 연산은 값을 단순히 곱셈이나 나눗셈으로 바꾸는 것보다, 비트 위치를 이동시키는 의미가 더 중요합니다.
- 비트 연산은 부호 있는 정수보다
unsigned정수에서 의도가 더 분명하고 안전한 편입니다.
짧은 예제
c
#include <stdio.h>
enum {
READ_FLAG = 1u << 0,
WRITE_FLAG = 1u << 1,
EXEC_FLAG = 1u << 2
};
int main(void) {
unsigned int permission = READ_FLAG | WRITE_FLAG;
if (permission & WRITE_FLAG) {
printf("write enabled\n");
}
permission ^= READ_FLAG;
printf("permission = %u\n", permission);
return 0;
}빠른 정리
| 항목 | 설명 |
|---|---|
<code>&</code> | 비트 AND, 공통으로 켜진 비트만 남김 |
<code>|</code> | 비트 OR, 둘 중 하나라도 켜진 비트를 켬 |
<code>^</code> | 비트 XOR, 서로 다른 비트만 켬 |
<code>~</code> | 비트 NOT, 비트를 뒤집음 |
<code><<</code> / <code>>></code> | 비트를 왼쪽 또는 오른쪽으로 이동 |
주의할 점
부호 있는 정수의 오른쪽 시프트나 오버플로우에 기대면 구현마다 결과 해석이 달라질 수 있습니다. 비트 마스크는 unsigned 타입을 기본으로 생각하는 편이 좋습니다.