[C#, ENUM] ENUM으로 bit 연산하기 (FlagsAttribute))

using System;

// Enum을 그대로 출력하면 String 출력됩니다.
Console.WriteLine(EnumBit.AAA);
Console.WriteLine(EnumBit.BBB);
Console.WriteLine(EnumBit.CCC);
Console.WriteLine(EnumBit.DDD);
Console.WriteLine(EnumBit.EEE);

// Enum을 byte, short, int, long으로 형변환하면 할당한 숫자가 출력됩니다.
Console.WriteLine((int)EnumBit.AAA);
Console.WriteLine((int)EnumBit.BBB);
Console.WriteLine((int)EnumBit.CCC);
Console.WriteLine((int)EnumBit.DDD);
Console.WriteLine((int)EnumBit.EEE);

// Enum으로 Bit 연산을 수행합니다.
EnumBit myStatus1 = EnumBit.AAA | EnumBit.BBB | EnumBit.CCC | EnumBit.DDD | EnumBit.EEE;
Console.WriteLine(myStatus1);
Console.WriteLine((int)myStatus1);

EnumBit myStatus2 = EnumBit.AAA | EnumBit.CCC | EnumBit.DDD;
Console.WriteLine(myStatus2);
Console.WriteLine((int)myStatus2);

bool myStatus2Check1 = myStatus2.HasFlag(EnumBit.AAA); // 포함되어 있습니다.
bool myStatus2Check2 = myStatus2.HasFlag(EnumBit.BBB); // 포함되지 않았습니다.

Console.WriteLine(myStatus2Check1);
Console.WriteLine(myStatus2Check2);

EnumBit enumValue1 = (EnumBit)31;
Console.WriteLine(enumValue1); // 사전에 정의한 enum값의 범위 안에있으면 정상 Enum 값을 나열합니다.

EnumBit enumValue2 = (EnumBit)1035;
Console.WriteLine(enumValue2); // 사전에 정의한 enum값의 범위를 초과하면 숫자가 나열됩니다.

[Flags]
enum EnumBit
{
    AAA = 1 << 0, // 1
    BBB = 1 << 1, // 2
    CCC = 1 << 2, // 4
    DDD = 1 << 3, // 8
    EEE = 1 << 4, // 16
}

enum에 FlagsAttribute를 사용하면 bit 연산을 가능하게 합니다.
enum으로 상태값을 저장해놓고 데이터에 대하여 여러상태를 저장하고 싶을 때 쉽게 사용할 수 있습니다.

좋아요 4

HasFlag는 여러 개 체크 된 경우는 안 잡아줘서
HasFlag보다 (myStatus1 & (EnumBit.AAA | EnumBit.BBB)) == (EnumBit.AAA | EnumBit.BBB) 를 쓸일이 더 많더라고요…

myStatus2 |= EnumBit.BBB; //특정 플래그 추가

myStatus2 &= ~(EnumBit.AAA | EnumBit.BBB); //특정 플래그 제거, 이 경우엔 있는 친구만 제거됩니다.

도 가능한 것으로 알고있습니다.

좋아요 2