플래그에서 비트 타이어 운영자 사용
-
22-08-2019 - |
문제
네 깃발이 있습니다
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
당신은 그것을 사용하고 그것을 사용하고 결과가 당신과 같은지 확인할 수 있습니까?