C# 비트 연산자란?
비트 연산자(Bitwise Operator)는 데이터를 비트(bit) 단위로 처리하며, 각 비트마다 개별적으로 연산을 수행하는 연산자입니다. 주로 플래그(flag) 관리, 비트 마스킹, 성능 최적화 등에 활용됩니다.
C#에서 지원하는 비트 연산자는 다음 표와 같습니다. 변수 A에는 60(이진수 0011 1100), 변수 B에는 13(이진수 0000 1101)이 저장되어 있다고 가정합니다.
| 연산자 | 설명 | 예제 |
|---|---|---|
| & | 비트 AND 연산자. 두 피연산자 모두에 해당 비트가 설정되어 있을 때만 결과에 비트를 복사합니다. | (A & B) = 12, 즉 0000 1100 |
| | | 비트 OR 연산자. 두 피연산자 중 하나라도 해당 비트가 설정되어 있으면 결과에 비트를 복사합니다. | (A | B) = 61, 즉 0011 1101 |
| ^ | 비트 XOR 연산자. 두 피연산자 중 정확히 하나에만 비트가 설정되어 있을 때 결과에 비트를 복사합니다. | (A ^ B) = 49, 즉 0011 0001 |
| ~ | 비트 1의 보수(One's Complement) 연산자. 단항 연산자로, 모든 비트를 반전('뒤집기')하는 효과가 있습니다. | (~A) = -61, 부호 있는 이진수의 2의 보수 표현으로 1100 0011 |
| << | 왼쪽 시프트 연산자. 왼쪽 피연산자의 값을 오른쪽 피연산자가 지정한 비트 수만큼 왼쪽으로 이동시킵니다. | A << 2 = 240, 즉 1111 0000 |
| >> | 오른쪽 시프트 연산자. 왼쪽 피연산자의 값을 오른쪽 피연산자가 지정한 비트 수만큼 오른쪽으로 이동시킵니다. | A >> 2 = 15, 즉 0000 1111 |
참고로 왼쪽 시프트는 2의 거듭제곱을 곱하는 것과 같은 효과가 있고(A << n = A × 2ⁿ), 오른쪽 시프트는 2의 거듭제곱으로 나누는 것과 같은 효과가 있습니다(A >> n = A ÷ 2ⁿ). 따라서 곱셈·나눗셈 대신 시프트 연산을 사용하면 더 빠른 성능을 얻을 수 있습니다.
예제 코드
다음은 C#에서 비트 연산자를 구현하고 사용하는 방법을 보여주는 예제입니다.
using System;
namespace MyApplication {
class Program {
static void Main(string[] args) {
int a = 60; /* 60 = 0011 1100 */
int b = 13; /* 13 = 0000 1101 */
int c = 0;
// 비트 AND 연산자
c = a & b; /* 12 = 0000 1100 */
Console.WriteLine("Line 1 - Value of c is {0}", c);
// 비트 OR 연산자
c = a | b; /* 61 = 0011 1101 */
Console.WriteLine("Line 2 - Value of c is {0}", c);
// 비트 XOR 연산자
c = a ^ b; /* 49 = 0011 0001 */
Console.WriteLine("Line 3 - Value of c is {0}", c);
// 비트 보수 연산자
c = ~a; /* -61 = 1100 0011 */
Console.WriteLine("Line 4 - Value of c is {0}", c);
// 왼쪽 시프트 연산자
c = a << 2; /* 240 = 1111 0000 */
Console.WriteLine("Line 5 - Value of c is {0}", c);
// 오른쪽 시프트 연산자
c = a >> 2; /* 15 = 0000 1111 */
Console.WriteLine("Line 6 - Value of c is {0}", c);
Console.ReadLine();
}
}
}실행 결과
Line 1 - Value of c is 12 Line 2 - Value of c is 61 Line 3 - Value of c is 49 Line 4 - Value of c is -61 Line 5 - Value of c is 240 Line 6 - Value of c is 15