2012-01-27 2 views
1

나는 다음과 같은 열거어떻게 원래 값을 얻기 위해 비트를 디코딩합니까?

[Flags] 
enum Options 
{ 
    Option1 = 1 << 0, 
    Option2 = 1 << 1, 
    Option3 = 1 << 2 
} 

이 내가

var options = 0; 
options |= Options.Option1; 
options |= Options.Option3; 

// now options should equal Option1 + Option3 
// I then store that single value in the database 
myDatabase.Options.Submit(options); 

가 어떻게 다시 원래 값을 얻기 위해 "옵션"을 구문 분석 할 다음과 같이 변수를 설정했다 가정? 같은

public List<Options> ParseOptions(Options options) 
{ 
    // Not sure how to parse the options. 
} 
+0

'옵션 및 Options.Option3 = 0' <- 옵션 3을 선택 . (나는 생각한다) – Joe

+0

당신이 옳다면, 형식 충돌을 피하기 위해 오른쪽 괄호 사이에 문장을 넣으십시오. 참고 : 0이 열거 형의 값이 아닌 경우 반환 된 int가 0이 아닌지 검사 할 수 있습니다 (충돌의 원인이 될 수 있음). (option & Options.Option3) == Options.Option3'. –

답변

6

당신은 특정 플래그가 설정되어 있는지 확인하기 위해 Enum.HasFlag() 방법을 사용할 수 있습니다. 설정된 경우 모든 개별 값 테스트를 수행하십시오. HasFlag() 방법은 .NET 4에 추가 된

var value = Options.Option1 | Options.Option3; 
foreach (Options flag in Enum.GetValues(typeof(Options))) 
{ 
    if (value.HasFlag(flag)) 
    { 
     // do something with the flag 
    } 
} 

참고 그러나 그것은이 논리적으로 동일합니다!

public static bool HasFlag(this Enum value, Enum flag) 
{ 
    return (value & flag) == flag; 
} 
+0

+1 슈퍼 메르 카도! 지식에 감사드립니다. – Joe

1

뭔가 :

public List<Options> ParseOptions(Options options)  
{ 
    var list = new List<Options>(); 

    foreach(MyEnum val in Enum.GetValues(typeof(myEnum))) 
    { 
     if ((val & options) == val) 
      List.Add(val); 
    } 

    return list; 
} 

가 (Visual Studio에서 확인되지 않음)

+0

C# 4.0에서는 비트 별 & 대신에 if (options.HasFlag (val)) {...}를 사용할 수 있습니다. –

+0

또는 :'(val & option)! = 0' – Jack

+0

@Jack : 엄밀히 말하면, 열거 형에 몇 가지 미친 다중 비트 값이 설정되어있는 경우 ('val & option) == option' 'val'과'option' 사이에는 부분적으로 중복이 있습니다. – LukeH

관련 문제