C 기본 문법 – 연산자 – 3 – 비트 연산자

C 기본 문법 – 연산자 – 3편: 비트 연산자 완전 정복

안녕하세요, 똑똑한 C 언어 학습자 여러분 😊
지금까지 우리는 산술 연산자, 관계 연산자, 논리 연산자를 차근차근 배워봤어요.
이번 시간에는 다소 생소할 수 있지만, 알아두면 강력한 무기가 되는 연산자!
바로 **비트 연산자(Bitwise Operators)**에 대해 배워보겠습니다.

🎯 비트 연산자는 정수 값을 이진수(0과 1) 형태로 다뤄서 연산하는 도구입니다.
하드웨어 제어, 속도 최적화, 저수준 프로그래밍, 게임 개발 등에서 정말 유용하게 쓰여요!

지금부터 차근차근 예시와 비유를 통해 비트 연산의 세계를 함께 탐험해볼까요? 🧠


비트(Bit)란?

비트는 0 또는 1로 이루어진 가장 작은 데이터 단위입니다.
정수는 결국 컴퓨터 안에서 이진수로 저장되기 때문에,
우리는 비트를 직접 조작해서 더 강력하고 빠른 코드를 만들 수 있어요!

예:

  • 5 = 00000101 (8비트 기준)
  • 3 = 00000011

비트 연산자 종류

연산자 이름 설명 예시
& 비트 AND 두 비트가 모두 1이면 1 a & b
` | ` 비트 OR 하나라도 1이면 1 `a | b`
^ 비트 XOR 서로 다르면 1 a ^ b
~ 비트 NOT 비트를 반전 ~a
<< 왼쪽 시프트 비트를 왼쪽으로 이동 a << 1
>> 오른쪽 시프트 비트를 오른쪽으로 이동 a >> 1

예제로 보는 비트 연산

#include <stdio.h>

int main() {
    unsigned char a = 5;   // 00000101
    unsigned char b = 3;   // 00000011

    printf("a & b = %d
", a & b);   // 00000001 → 1
    printf("a | b = %d
", a | b);   // 00000111 → 7
    printf("a ^ b = %d
", a ^ b);   // 00000110 → 6
    printf("~a = %d
", ~a);         // 11111010 → -6 (2의 보수)
    printf("a << 1 = %d
", a << 1); // 00001010 → 10
    printf("a >> 1 = %d
", a >> 1); // 00000010 → 2

    return 0;
}

비트 연산 개념 한눈에 이해하기

🔹 AND (&)

a = 0101
b = 0011
------------
a & b = 0001

둘 다 1이어야 1 → 공통 부분 추출

🔹 OR (|)

a = 0101
b = 0011
------------
a | b = 0111

하나라도 1이면 1 → 모든 비트 합치기

🔹 XOR (^)

a = 0101
b = 0011
------------
a ^ b = 0110

서로 다르면 1 → 비트 차이 추출

🔹 NOT (~)

a = 00000101
~a  = 11111010 (2의 보수: -6)

0은 1로, 1은 0으로 뒤집기 → 부호 반전 효과


시프트 연산자의 활용

🔸 왼쪽 시프트 <<

int a = 3;
int result = a << 2;  // 00000011 → 00001100 → 12
  • 2칸 왼쪽으로 이동 = 2의 2제곱 곱하기 (x4)

🔸 오른쪽 시프트 >>

int a = 16;
int result = a >> 2;  // 00010000 → 00000100 → 4
  • 2칸 오른쪽으로 이동 = 2의 2제곱 나누기 (/4)

💡 a << n == a × (2ⁿ)
💡 a >> n == a ÷ (2ⁿ)


비트 연산자는 어디에 쓰일까?

사용 예 설명
플래그 처리 여러 상태를 한 변수로 표현 (예: 권한 설정)
마스킹(masking) 특정 비트만 추출하거나 지움
성능 최적화 나눗셈, 곱셈보다 빠른 시프트 연산
하드웨어 제어 임베디드 시스템, 드라이버 개발 등
암호화/복호화 XOR 기반의 간단한 암호 기법 등

실전 예제: 플래그 체크하기

#define READ  0x01  // 00000001
#define WRITE 0x02  // 00000010
#define EXEC  0x04  // 00000100

int permission = READ | WRITE;  // 00000011

if (permission & READ) {
    printf("읽기 가능
");
}
if (permission & EXEC) {
    printf("실행 가능
");
} else {
    printf("실행 불가
");
}

출력 결과:

읽기 가능
실행 불가

🎯 permission & EXEC는 00000011 & 00000100 = 0 → 거짓
특정 기능이 포함되어 있는지 체크할 때 정말 유용하죠!


✅ 비트 연산자 정리표

연산자 의미 예시 설명
& AND a & b 공통 비트 추출
` | ` OR `a | b` 모든 비트 합침
^ XOR a ^ b 서로 다를 때 1
~ NOT ~a 비트 반전
<< 왼쪽 시프트 a << n a × 2ⁿ
>> 오른쪽 시프트 a >> n a ÷ 2ⁿ

⚠️ 비트 연산자 사용 시 주의할 점

주의사항 설명
음수의 시프트는 주의 부호 비트 처리 방식(이식성 문제) 존재
~ 연산 후 부호 변화에 유의 결과는 2의 보수 형태로 해석됨
시프트 시 범위 초과 금지 너무 큰 수만큼 이동하면 값이 이상해짐
논리 연산자(&&, ` | | `)와 혼동 금지 &, ` | 는 **비트 단위**,&&, | | `는 논리 연산

마무리하며 💬

비트 연산자는 처음엔 조금 낯설고 어렵게 느껴질 수 있지만,
컴퓨터의 가장 근본적인 연산 방식이기 때문에
하드웨어 제어, 게임 개발, 보안, 최적화 등의 분야에선 정말 자주 사용된답니다!

💡 여러분이 지금 배우는 비트 연산은
“C 언어 마스터리의 마지막 퍼즐 조각” 중 하나예요!

다음 편에서는 **삼항 연산자(?:)**를 배워서
조건문을 더 간단하게 표현하는 기술도 익혀볼 거예요.

그럼 오늘도 수고 많으셨고, 언제나 감사합니다! 😊
계속해서 코딩 실력, 한 뼘씩 성장해나가요 💻🚀

답글 남기기