
회사에서 컨텐츠 개발을 하다보면 'enum 비트 플래그'를 쓰는 경우가 있는데, 여러 상태를 하나의 값으로 처리 할 수 있는 장점이 있다. 이왕 쓰는거 정리포스트를 올리자 싶어 적어본다.
👩💻 예제 코드
- 바구니에 과일을 담고 확인해보자.
1. flags Fruit 정의
[Flags]
public enum Fruit
{
None = 0,
Apple = 1 << 0, // 1
WaterMelon = 1 << 1, // 2
Orange = 1 << 2, // 4
Plum = 1 << 3, // 8
Banana = 1 << 4, // 16
Peach = 1 << 10, // 1024
All = Apple | WaterMelon | Orange |
Plum | Banana | Peach
}
- 1 << n 방식은 각 항목을 2의 거듭제곱으로 만들어서 중복 없이 조합 가능
- [Flags]를 붙이면 ToString() 출력 시 "Apple, WaterMelon"처럼 나와서 디버깅도 굿
- All을 만들어두면 향후 자동 패치할 때 유용
2. 실제 사용하기
// 장바구니에 사과랑 바나나를 담음
var basket = Fruit.Apple | Fruit.Banana;
Console.WriteLine($"장바구니:({(int)basket}):{basket.ToString()}");
// 수박 체크
if (basket.HasFlag(Fruit.WaterMelon))
{
Console.WriteLine("수박을 담았습니다.");
}
else
{
Console.WriteLine("수박이 없습니다. 수박을 담겠습니다.");
basket |= Fruit.WaterMelon;
}
Console.WriteLine($"장바구니:({(int)basket}):{basket.ToString()}");

- 추가는 or 연산으로 | 연산자를 사용하여 추가
- 포함은 .HasFlag 함수로 쉽게 가능 있으면 true, 없으면 false
⚠️ 주의
- 값은 항상 명시해야 한다.
- 비트 플래그는 1 << n 형식으로 직접 값 지정을 해야 한다.
❌ 틀림
[Flags]
public enum BadEnum
{
A = 1 << 0, // 1
B = 1 << 1, // 2
C // 자동으로 3 → 비트 플래그 깨짐!
}
⭕ 맞음
[Flags]
public enum GoodEnum
{
A = 1 << 0,
B = 1 << 1,
C = 1 << 2
}
🔍 기타
📌 최대 몇 개까지 쓸 수 있을까?
- C# enum의 기본 타입은 int(32비트 정수)
- 1 << 0 부터 1 << 31까지 사용가능
참고 : 1 << 31은 int 에서는 음수처럼 보일 수 있지만, 비트연산에는 문제가 없음!
📌 32개 이상이 필요한 경우 long으로 바꾸면 된다.
[Flags]
public enum Fruit : long
{
None = 0,
Apple = 1L << 0, // 1
WaterMelon = 1L << 1, // 2
Orange = 1L << 2, // 4
Plum = 1L << 3, // 8
Banana = 1L << 4, // 16
Peach = 1L << 31, // 1024
All = Apple | WaterMelon | Orange |
Plum | Banana | Peach
}
⚠️ 주의
- 32부터 1L 로 써야 한다, 왜냐면 1은 기본적으로 int 기 때문에 int 범위를 넘은 32부터는 L 을 꼭 붙여야 한다.
📌 1 << n, 32까지 전테 비트값 테이블 (int 기준)
n (비트 위치) | 1 << n | 값10진수 | 2진수 표현 (앞자리 생략 없음) |
0 | 1 << 0 | 1 | 00000000 00000000 00000000 00000001 |
1 | 1 << 1 | 2 | 00000000 00000000 00000000 00000010 |
2 | 1 << 2 | 4 | 00000000 00000000 00000000 00000100 |
3 | 1 << 3 | 8 | 00000000 00000000 00000000 00001000 |
4 | 1 << 4 | 16 | 00000000 00000000 00000000 00010000 |
5 | 1 << 5 | 32 | 00000000 00000000 00000000 00100000 |
6 | 1 << 6 | 64 | 00000000 00000000 00000000 01000000 |
7 | 1 << 7 | 128 | 00000000 00000000 00000000 10000000 |
8 | 1 << 8 | 256 | 00000000 00000000 00000001 00000000 |
9 | 1 << 9 | 512 | 00000000 00000000 00000010 00000000 |
10 | 1 << 10 | 1,024 | 00000000 00000000 00000100 00000000 |
11 | 1 << 11 | 2,048 | 00000000 00000000 00001000 00000000 |
12 | 1 << 12 | 4,096 | 00000000 00000000 00010000 00000000 |
13 | 1 << 13 | 8,192 | 00000000 00000000 00100000 00000000 |
14 | 1 << 14 | 16,384 | 00000000 00000000 01000000 00000000 |
15 | 1 << 15 | 32,768 | 00000000 00000000 10000000 00000000 |
16 | 1 << 16 | 65,536 | 00000000 00000001 00000000 00000000 |
17 | 1 << 17 | 131,072 | 00000000 00000010 00000000 00000000 |
18 | 1 << 18 | 262,144 | 00000000 00000100 00000000 00000000 |
19 | 1 << 19 | 524,288 | 00000000 00001000 00000000 00000000 |
20 | 1 << 20 | 1,048,576 | 00000000 00010000 00000000 00000000 |
21 | 1 << 21 | 2,097,152 | 00000000 00100000 00000000 00000000 |
22 | 1 << 22 | 4,194,304 | 00000000 01000000 00000000 00000000 |
23 | 1 << 23 | 8,388,608 | 00000000 10000000 00000000 00000000 |
24 | 1 << 24 | 16,777,216 | 00000001 00000000 00000000 00000000 |
25 | 1 << 25 | 33,554,432 | 00000010 00000000 00000000 00000000 |
26 | 1 << 26 | 67,108,864 | 00000100 00000000 00000000 00000000 |
27 | 1 << 27 | 134,217,728 | 00001000 00000000 00000000 00000000 |
28 | 1 << 28 | 268,435,456 | 00010000 00000000 00000000 00000000 |
29 | 1 << 29 | 536,870,912 | 00100000 00000000 00000000 00000000 |
30 | 1 << 30 | 1,073,741,824 | 01000000 00000000 00000000 00000000 |
31 | 1 << 31 | -2,147,483,648 | 10000000 00000000 00000000 00000000 ← 부호 비트 1 |