비트 연산자(Bitwise Operator)는 데이터를 비트(bit) 단위로 다루며, 각 비트별로 연산을 수행하는 연산자입니다. 주로 정수형 값의 이진수 표현을 직접 조작해야 할 때 사용되며, 플래그 처리, 성능 최적화, 저수준 프로그래밍 등에서 유용하게 활용됩니다.
C#에서 제공하는 비트 연산자는 다음과 같습니다.
| 연산자 | 설명 | 예시 |
|---|---|---|
| & | AND(논리곱) 연산자 — 두 피연산자 모두에 해당 비트가 1로 설정되어 있을 때만 결과에 1을 복사합니다. | (A & B) = 12, 즉 0000 1100 |
| | | OR(논리합) 연산자 — 두 피연산자 중 어느 한쪽에라도 해당 비트가 설정되어 있으면 결과에 1을 복사합니다. | (A | B) = 61, 즉 0011 1101 |
| ^ | XOR(배타적 논리합) 연산자 — 두 피연산자 중 하나에만 비트가 설정되어 있고 양쪽 모두에는 없을 때 1을 복사합니다. | (A ^ B) = 49, 즉 0011 0001 |
| ~ | 보수(NOT) 연산자 — 단항 연산자로, 모든 비트를 반전('뒤집기')합니다. | (~A) = -61, 부호 있는 이진수이므로 2의 보수 표현으로 1100 0011 |
| << | 왼쪽 시프트 연산자 — 왼쪽 피연산자의 값을 오른쪽 피연산자가 지정한 비트 수만큼 왼쪽으로 이동시킵니다. | A << 2 = 240, 즉 1111 0000 |
| >> | 오른쪽 시프트 연산자 — 왼쪽 피연산자의 값을 오른쪽 피연산자가 지정한 비트 수만큼 오른쪽으로 이동시킵니다. | A >> 2 = 15, 즉 0000 1111 |
아래 예제는 C#에서 비트 연산자를 실제로 사용하는 방법을 보여줍니다. 변수 a는 60(0011 1100), 변수 b는 13(0000 1101)으로 초기화한 뒤 각 연산자를 적용합니다.
예제 코드
using System;
namespace Demo {
class Program {
static void Main(string[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
c = a & b; /* 12 = 0000 1100 */
Console.WriteLine("c의 값은 {0}", c );
c = a | b; /* 61 = 0011 1101 */
Console.WriteLine("c의 값은 {0}", c);
c = a ^ b; /* 49 = 0011 0001 */
Console.WriteLine("c의 값은 {0}", c);
c = ~a; /* -61 = 1100 0011 */
Console.WriteLine("c의 값은 {0}", c);
c = a << 2; /* 240 = 1111 0000 */
Console.WriteLine("c의 값은 {0}", c);
c = a >> 2; /* 15 = 0000 1111 */
Console.WriteLine("c의 값은 {0}", c);
Console.ReadLine();
}
}
}실행 결과
c의 값은 12 c의 값은 61 c의 값은 49 c의 값은 -61 c의 값은 240 c의 값은 15
핵심 정리
위 실행 결과에서 알 수 있듯이, AND(&)는 공통 비트만 남기고, OR(|)는 비트를 합치며, XOR(^)은 서로 다른 비트만 추출합니다. NOT(~)은 비트를 반전하여 음수가 되고, 시프트 연산(<<, >>)은 각각 2의 거듭제곱 배 곱셈·나눗셈과 같은 효과를 냅니다. 예를 들어 a << 2는 60 × 4 = 240이 되고, a >> 2는 60 ÷ 4 = 15가 되는 것입니다.