Testing a [Flags] enum value for a single value

戏子无情 提交于 2020-01-01 03:00:09

问题


If I have an enum that's marked with [Flags], is there a way in .NET to test a value of this type to see if it only contains a single value? I can get the result I want using bit-counting, but I'd rather use built-in functions if possible.

When looping through the enum values dynamically, Enum.GetValues() returns the combination flags as well. Calling that function on the enum in the following example returns 4 values. However, I don't want the value combinations included in the inner algorithm. Testing individual enum values for equality is out, since the enum could potentially contain many values, and it also requires extra maintenance when the values in the enum change.

[Flags]
enum MyEnum
{
    One = 1,
    Two = 2,
    Four = 4,
    Seven = One | Two | Four,
}

void MyFunction()
{
    foreach (MyEnum enumValue in Enum.GetValues(typeof(MyEnum)))
    {
        if (!_HasSingleValue(enumValue)) continue;

        // Guaranteed that enumValue is either One, Two, or Four
    }
}

private bool _HasSingleValue(MyEnum value)
{
    // ???
}



Related: StackOverflow: Enum.IsDefined on combined flags


回答1:


You can cast it to int and use the techniques from Bit Twiddling Hacks to check if it's a power of two.

int v = (int)enumValue;
return v != 0 && (v & (v - 1)) == 0;



回答2:


You can use a combination of IsDefined and checking for powers of 2.




回答3:


You could you Enum.GetValues and count only those items that are a power of 2 (evenly divisible by 2 with no remainder).



来源:https://stackoverflow.com/questions/1662144/testing-a-flags-enum-value-for-a-single-value

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!