비트 연산자(Bitwise Operator)는 두 변수에 대해 비트(bit) 단위의 연산을 수행하는 데 사용됩니다. C 언어는 정수 데이터를 이진수로 다루면서 각 비트별로 논리 연산이나 시프트 연산을 직접 적용할 수 있기 때문에, 저수준 프로그래밍이나 임베디드 시스템 개발에서 특히 유용하게 활용됩니다.
C 언어의 비트 연산자 종류
| 연산자 | 연산자 이름 |
|---|---|
| & | 비트 AND |
| | | 비트 OR |
| ^ | 비트 XOR |
| ~ | 비트 보수(Complement) |
| << | 왼쪽 시프트(Shift Left) |
| >> | 오른쪽 시프트(Shift Right) |
연산자별 동작 원리
- & (AND) : 대응되는 두 비트가 모두 1일 때만 결과가 1이 됩니다.
- | (OR) : 대응되는 두 비트 중 하나라도 1이면 결과가 1이 됩니다.
- ^ (XOR) : 대응되는 두 비트가 서로 다를 때 결과가 1이 됩니다.
- ~ (보수) : 모든 비트를 반전시킵니다(0은 1로, 1은 0으로). 일반적으로 ~n은 -(n+1)과 같습니다.
- << (왼쪽 시프트) : 비트를 왼쪽으로 이동하며, n칸 이동하면 값이 2ⁿ배가 되는 효과가 있습니다.
- >> (오른쪽 시프트) : 비트를 오른쪽으로 이동하며, n칸 이동하면 값이 2ⁿ으로 나뉘는 효과가 있습니다.
예제 코드
다음은 C 언어에서 비트 연산자를 사용하는 예제입니다.
#include <stdio.h>
int main() {
int x = 10;
int y = 28;
int i = 0;
printf("Bitwise AND : %d\n", x&y);
printf("Bitwise OR : %d\n", x|y);
printf("Bitwise XOR : %d\n", x^y);
printf("Bitwise Complement : %d,%d\n", ~x,~-y);
for(i;i<2;i++)
printf("Right shift by %d: %d\n", i, x>>i);
for(i;i<=3;++i)
printf("Left shift by %d: %d\n", i, y<<i);
return 0;
}
실행 결과
Bitwise AND : 8 Bitwise OR : 30 Bitwise XOR : 22 Bitwise Complement : -11,27 Right shift by 0: 10 Right shift by 1: 5 Left shift by 2: 112 Left shift by 3: 224
결과 분석
x = 10은 이진수로 01010, y = 28은 이진수로 11100입니다. 각 연산 결과를 살펴보면 다음과 같습니다.
- AND : 01010 & 11100 = 01000 → 8
- OR : 01010 | 11100 = 11110 → 30
- XOR : 01010 ^ 11100 = 10110 → 22
- 보수 : ~10 = -(10+1) → -11, ~(-28) = 28-1 → 27
- 오른쪽 시프트 : 10 >> 1 = 5 (2로 나눈 효과)
- 왼쪽 시프트 : 28 << 2 = 112, 28 << 3 = 224 (각각 4배, 8배 곱한 효과)
이처럼 비트 연산자는 곱셈·나눗셈을 빠르게 처리하거나 플래그(flag) 관리, 마스킹(masking) 등에 활용할 수 있는 강력한 도구입니다.