C#에서 enum 비트 플래그

ChatGPT Image 2025년 3월 27일 오후 03_55_47.png




회사에서 컨텐츠 개발을 하다보면 '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()}");

 

 

 

etc-image-1

 

- 추가는 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