문제

네 깃발이 있습니다

Current = 0x1  
Past = 0x2  
Future = 0x4  
All = 0x7

과거와 미래의 두 깃발을 받는다 고 가정 해setFlags(PAST | FUTURE)). 내가 어떻게 말할 수 있습니까? Past 그것에 있습니까? 마찬가지로 어떻게 말할 수 있습니까? Current 안에 있지 않습니까? 그렇게하면 가능한 모든 조합을 테스트 할 필요는 없습니다.

도움이 되었습니까?

해결책

테스트 마스크의 모든 비트가 일치하도록하려면 다음과 같습니다.

if((value & mask) == mask) {...}

테스트 마스크에서 단일 비트가 일치하도록하려면 다음과 같습니다.

if((value & mask) != 0) {...}

여러 가지에 대한 값을 테스트 할 때 차이가 가장 분명합니다.

제외 테스트 :

if ((value & mask) == 0) { }

다른 팁

우선 - Flagattribute와 함께 열거를 사용하십시오. 그게 바로 그게되었습니다.

[Flags]
public enum Time
{
    None = 0
    Current = 1,
    Past = 2,
    Future = 4
    All = 7
}

그런 다음 테스트는 다음과 같이 수행됩니다.

if ( (x & Time.Past) != 0 )

아니면 이거:

if ( (x & Time.Past) == Time.Past )

"과거"가 깃발의 조합이었고 모든 것을 테스트하고 싶다면 후자는 더 잘 작동합니다.

설정은 다음과 같습니다.

x |= Time.Past;

세트는 다음과 같습니다.

x &= ~Time.Past;

추가 할 수도 있습니다 확장 방법 이와 같이

  enum states {
     Current = 0x1,
     Past = 0x2,
     Future = 0x4,
     All = 0x7
  };

  static bool Is(this states current, states value) {
     return (current & value) == value;
  }

그런 다음 할 수 있습니다 :

 if(state.Is(states.Past)) {
    // Past
 }
if ((flags & PAST) == PAST)
{
  // PAST is there
}

if ((flags & CURRENT) != CURRENT)
{
  // CURRENT is not there
}

.NET 4 이상을 사용하는 경우이 작업을 선호합니다. 클리너 IMAO :

[Flags]
public enum Time
{
    None = 0
    Current = 1,
    Past = 2,
    Future = 4
}

myProp = Time.Past | Time.Future;

if (myProp.HasFlag(Time.Past))
{
    // Past is set...
}

Marc Gravell과 Vilx-'s 답변에 대한 부록 :

신고 열거는 "모두"에 대한 금액을 지정해서는 안되며 기존 값 만 포함해야합니다. 이것은 계산 된 값에 적용됩니다.

[Flags]
public enum Time
{
    None = 0,
    Current = 1,
    Past = 2,
    Future = 4,
    All = Current | Past | Future
}

vilx- 값에 대한 16 진수의 사용을 제거했습니다. 0x8을 지나면 값이 16 진수를 준수해야하기 때문에 이것은 중요합니다. 당신은 단지 10 진수로 머물러야합니다.

편집하다:또한 16 진수/소수성보다는 비트 시프트를 사용할 수 있다고 덧붙이고 싶습니다.

이것은 다음과 같습니다.

[Flags]
public enum Time
{
    None = 0,
    Current = 1,
    Past = 1 << 1, // 2, 10 binary
    Future = 1 << 2, // 4, 100 binary
    All = Current | Past | Future
}
(value & Current) == Current

당신은 그것을 사용하고 그것을 사용하고 결과가 당신과 같은지 확인할 수 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top