Bit Flag of Enum

Posted in .NET Framework // Posted at 2013. 5. 28. 17:54
728x90

다음 문제를 풀어 보자.

 

문> 다음 코드에서 잘못 된 부분을 찾아 올바로 고치시오

 

     [Flags]
     enum LogType { File = 1,  Database = 2,  EventLog = 3 }

 

문제를 쉽게 풀었다면 패스~~

 

Enum을 정의할 때 FlagAttribute를 적용하면, 열거형 값들을 조합해서 사용할 수 있다.

예를 들어 File과 Database 두 값 모두 라는 의미로 다음과 같은 코드 사용이 가능하다

 

LogType logType = LogType.File | LogType.Database

...

bool isFile = (myType & LogType.File) == LogType.File;

 

FlagAttribute는 Enum을 BIT Flag 처리가 가능하도록 설정하는 것이다.

BIT Flag의 동작 방식을 이해하고 있었다면, 문제를 쉽게 풀었을 것이다.

 

열거자 목록에 사용된 값들의 bit가 켜고 끄는 형태 즉, On/Off 형태가 되도록 구성해야 한다.

그래야 bit의 OR / AND 연산이 제대로 동작하게 되는 것이다.

 

다시 말해, 각 값들의 비트 구성이 다음과 같도록 구성해야 한다.

 

 

따라서 정답은 다음과 같다.

[Flags]
enum LogType { File = 1, Database = 2, EventLog = 4 }

 

이제 다음 코드의 의미를 다시 보면,

LogType logType = LogType.File | LogType.Database

 

정수 1과 2(비트 1과 10)의 비트를 (OR 연산으로) 모두 ON 상태로 만드는 것이다.

 

그리고 다음 연산으로 자신의 비트만 켤수 있도록 비교하게 된다.

(myType & LogType.File) == LogType.File

 

----------------------------------------------------------------------------------------

 

여기서 좀 더 세련된 코딩을 하자 치면...

 

이러한 비트 구성은 2의 제곱형태가 되는 걸 알 수 있다.

 

 

 

즉 비트가 왼쪽으로 한 칸씩 쉬프트되는 구조 이므로 다음과 같이 코딩할 수 있겠다

 

[Flags]
enum LogType { File = 1 << 0, Database = 1 << 1, EventLog = 1 << 2 }

 

-------------------------------------------------------------------------------------

 

마지막으로 전체 선택은 비트를 모두 켠(ON) 것이고,

그 반대는 비트를 모두 끈(OFF)한 것이므로 다음과 같이 코딩하면 된다.

[Flags]
enum LogType

{

  None = 0,  

  File = 1 << 0, Database = 1 << 1, EventLog = 1 << 2,

  All = File | Database | EventLog  

 }

 

열거자 값이 많고 계속 늘어날 수 있는 경우 모든 비트가 켜진 정수의 최대값을 지정해되 된다.

All = Int32.MaxValue

 

 

 

 

 

'.NET Framework' 카테고리의 다른 글

IOC using Ninject  (2) 2013.06.18
Security in OAuth  (4) 2013.05.29
TimeStampHasCreationTimeInFuture in WCF Security 2  (4) 2013.05.23
TimeStampHasCreationTimeInFuture in WCF Security  (4) 2013.05.14
serviceThrottling in WCF  (4) 2013.05.13