C 비트 연산자 마스터: AND, OR, XOR, 시프트, 컴플리먼트
비트 연산자(Bitwise Operators)란?
비트 연산자는 정수 값의 개별 비트를 조작합니다. 정수 전체에서 작동하는 산술 연산자와 달리, 비트 연산자는 이진 표현에 작용하므로 플래그, 비트 마스크, 저수준 장치 제어 같은 성능 중요 작업에 이상적입니다.
C에서 사용 가능한 비트 연산자:
| 연산자 | 의미 |
| & | 비트 AND |
| | | 비트 OR |
| ^ | 비트 XOR (배타적 OR) |
| ~ | 비트 NOT (1의 보수) |
| << | 왼쪽 시프트 |
| >> | 오른쪽 시프트 |
비트 연산자는 정수 타입에만 정의되며 float나 double 같은 부동소수점 타입에는 적용 불가.
연산은 최하위 비트(LSB)에서 시작해 최상위 비트(MSB)로 진행합니다. 다음 진리표는 이진 결과를 요약합니다:
피연산자 x | 피연산자 y | x & y | x | y | x ^ y |
| 0 | 0 | 0 | 0 | 0 |
| 0 | 1 | 0 | 1 | 1 |
| 1 | 0 | 0 | 1 | 1 |
| 1 | 1 | 1 | 1 | 0 |
다음 섹션에서 각 연산자를 예제와 함께 자세히 다룹니다.
비트 AND (&)
AND 연산자는 두 해당 비트가 모두 1일 때만 1 반환, 그렇지 않으면 0. 원치 않는 비트 마스킹에 흔히 사용.
Op1 = 0000 1101
Op2 = 0001 1001
Result = 0000 1001
비트 OR (|)
OR 연산자는 두 비트 중 적어도 하나가 1이면 1 반환. 특정 비트 설정에 유용.
Op1 = 0000 1101
Op2 = 0001 1001
Result = 0001 1101
비트 XOR (^)
XOR 연산자는 비트가 다를 때만 1 반환. 비트 토글에 편리.
Op1 = 0000 1101
Op2 = 0001 1001
Result = 0001 0100
예제 프로그램:
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int b = 21; /* 21 = 010101 */
int c = 0;
c = a & b; /* 20 = 010100 */
printf("AND - c = %d\n", c);
c = a | b; /* 21 = 010101 */
printf("OR - c = %d\n", c);
c = a ^ b; /* 1 = 000001 */
printf("XOR - c = %d\n", c);
return 0;
}
출력:
AND - c = 20
OR - c = 21
XOR - c = 1
비트 시프트 연산자(<<, >>)
시프트 연산자는 비트를 지정된 횟수만큼 왼쪽 또는 오른쪽으로 이동.
operand << n – 왼쪽으로 시프트, 오른쪽에 0 삽입
operand >> n – 오른쪽으로 시프트, 왼쪽에 0 삽입
4비트 숫자 1111 예시:
x << 2 → 1100
x >> 2 → 0011
프로그램 예시:
#include <stdio.h>
int main() {
int a = 20; /* 20 = 010100 */
int c = 0;
c = a << 2; /* 80 = 101000 */
printf("Left shift - c = %d\n", c);
c = a >> 2; /* 5 = 000101 */
printf("Right shift - c = %d\n", c);
return 0;
}
출력:
Left shift - c = 80
Right shift - c = 5
비트 컴플리먼트(~)
컴플리먼트 연산자는 모든 비트 반전: 1→0, 0→1. 단일 피연산자에 적용되는 단항 연산자.
0000 1111 → 1111 0000
예제 프로그램:
#include <stdio.h>
int main() {
int a = 10; /* 10 = 001010 */
int c = ~a; /* 2의 보수로 -11 */
printf("Complement - c = %d\n", c);
return 0;
}
출력:
Complement - c = -11
모든 연산자 종합 예제
아래는 논의된 모든 비트 연산자를 보여주는 간결한 프로그램입니다.
#include <stdio.h>
int main() {
unsigned int x = 48; /* 0011 0000 */
unsigned int y = 13; /* 0000 1101 */
int z = 0;
z = x & y; /* 0 = 0000 0000 */
printf("AND - x & y = %d\n", z);
z = x | y; /* 61 = 0011 1101 */
printf("OR - x | y = %d\n", z);
z = x ^ y; /* 61 = 0011 1101 */
printf("XOR - x ^ y = %d\n", z);
z = ~x; /* -49 = 1111 0100 (2의 보수) */
printf("NOT - ~x = %d\n", z);
z = x << 2; /* 192 = 1100 0000 */
printf("Left shift - x << 2 = %d\n", z);
z = x >> 2; /* 12 = 0000 1100 */
printf("Right shift - x >> 2 = %d\n", z);
return 0;
}
결과:
AND - x & y = 0
OR - x | y = 61
XOR - x ^ y = 61
NOT - ~x = -49
Left shift - x << 2 = 192
Right shift - x >> 2 = 12
핵심 요약
- 비트 연산자는 정수 타입 전용이며 이진 수준에서 작동
- 논리(AND, OR, XOR), 시프트(좌/우), 컴플리먼트(~) 연산 포함
- 플래그 조작, 저수준 I/O, 성능 중요 코드에 필수적