C시작과 문법

비트 연산

마스크, 플래그, 하드웨어 제어에서 자주 쓰는 C 비트 연산자의 핵심 의미를 정리합니다.

마지막 수정 2026년 3월 19일

기본 패턴

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>&amp;</code>비트 AND, 공통으로 켜진 비트만 남김
<code>&#124;</code>비트 OR, 둘 중 하나라도 켜진 비트를 켬
<code>^</code>비트 XOR, 서로 다른 비트만 켬
<code>~</code>비트 NOT, 비트를 뒤집음
<code>&lt;&lt;</code> / <code>&gt;&gt;</code>비트를 왼쪽 또는 오른쪽으로 이동

주의할 점

부호 있는 정수의 오른쪽 시프트나 오버플로우에 기대면 구현마다 결과 해석이 달라질 수 있습니다. 비트 마스크는 unsigned 타입을 기본으로 생각하는 편이 좋습니다.