출처 : MSDN, 기타 블로그
enum Days { Sunday, Monday, Tuesday, Wednesday, Thursday, Friday, Saturday };
위와 같은 일반 열거형인 enum을
아래와 같은 형식으로 바꿔주게 되면,
[Flags] enum Days2 { None = 0x0, Sunday = 0x1, Monday = 0x2, Tuesday = 0x4, Wednesday = 0x8, Thursday = 0x10, Friday = 0x20, Saturday = 0x40,
All = int.MaxValue
}
아래와 같이 AND, OR, NOT 및 XOR 비트 연산을 수행하여 합치거나 비교하는 등의 유용한 사용을 꾀할 수 있습니다.
// Initialize with two flags using bitwise OR.
meetingDays = Days2.Tuesday | Days2.Thursday; // Set an additional flag using bitwise OR.
meetingDays = meetingDays | Days2.Friday; Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Tuesday, Thursday, Friday // Remove a flag using bitwise XOR.
meetingDays = meetingDays ^ Days2.Tuesday;
Console.WriteLine("Meeting days are {0}", meetingDays);
// Output: Meeting days are Thursday, Friday
// Test value of flags using bitwise AND. 특정 플래그가 설정되어 있는지의 여부를 확인하려는 연산
bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
Console.WriteLine("Thursday {0} a meeting day.", test == true ? "is" : "is not");
// Output: Thursday is a meeting day.
더 간단히 요약하자면
- 두 속성을 하나의 변수에 담는 것 : meetingDays = Days2.Tuesday | Days2.Thursday;
- 값이 존재하는지 확인 : bool test = (meetingDays & Days2.Thursday) == Days2.Thursday;
- 특정 값을 추가 : meetingDays = meetingDays | Days2.Friday;
- 특정 값을 제거 : meetingDays = meetingDays ^ Days2.Tuesday;
- 특정 값을 반전 (1->0, 0->1) : meetingDays &= ~Days2.Thursday;
- 모든 값 삭제 : meetingDays = Days2.None;
- 모든 값 설정 : meetingDays = Days2.All;
- 특정 값을 제외하고 모두 설정 : meetingDays = Days2.All ^ Days2.Sunday ^ Days2.Monday;
20121220추가 (펌)
[Flags]
public
enum
PriceType
{
None = 0,
Gold = 1 << 0,
Cash = 1 << 1,
Heart = 1 << 2,
Free = 1 << 3,
All =
int
.MaxValue
// int의 Max값을 넣으면 모든 비트가 1이므로 무조건 All이 된다
}
// [Flags] Attribute를 위에 붙여주면 비트연산처럼 사용가능
PriceType e_PriceType = PriceType.Gold | PriceType.Cash;
// Flag 값 확인
if
((e_PriceType & PriceType.Gold) != 0)
{
// Gold Flag값이 들어있으면
}
// Gold Flag 설정
e_PriceType |= PriceType.Gold;
// Gold Flag 제거
e_PriceType &= ~PriceType.Gold;
// Gold Flag 반전 (있으면 제거하고 없으면 설정)
e_PriceType ^= PriceType.Gold;
// Flag 모두 제거
e_PriceType = PriceType.None;
// Flag 모두 설정
e_PriceType = PriceType.All;
// Gold와 Free를 제외하고 모두 설정
e_PriceType = PriceType.All ^ PriceType.Gold ^ PriceType.Free;
'NOTE > Programming' 카테고리의 다른 글
[C#] Dictionary<Tkey, TValue> 클래스 (0) | 2018.04.01 |
---|---|
[C++] 문자열을 입력받는 12가지 방법 (펌) (0) | 2018.04.01 |
[C#] Singleton (0) | 2016.10.05 |
[C#] Func & Action 델리게이트 (펌) (0) | 2016.09.29 |
[C#] 람다식 (펌) (0) | 2016.09.29 |