如何解码位以获取原始值?

时间:2012-01-27 01:16:17

标签: c# parsing bit-manipulation

假设我有以下枚举

[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.
}

2 个答案:

答案 0 :(得分:6)

您可以使用Enum.HasFlag()方法查看是否设置了特定标志。如果已设置,只需完成所有单个值测试。

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

请注意,HasFlag()方法已添加到.NET 4.但它在逻辑上等同于此:

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

答案 1 :(得分: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中验证)