按位组合作为整数到枚举

时间:2018-06-05 07:38:19

标签: c# vb.net math logic bit

目前我正在尝试解析一个整数,该整数是来自第三方API的枚举的按位组合。例如:我收到integer,其值为1035,此值包含三个枚举值;

enum Status
    1= "Status 1" 
    2= "Status 2" 
    4= "Status 3" 
    8= "Status 4" 
    ........ 
    1024= "Status 8"
end enum

所以我需要一个将值1035转换为Status 1 + Status 2 + Status 4 + Status 8

的函数

尝试将其转换为Bit,然后使用位移,但这并没有给我正确的结果...希望有人可以在C#或vb.net示例中帮助我。

4 个答案:

答案 0 :(得分:2)

如果将[Flags]属性应用于枚举,它将使枚举的ToString()返回一个字符串,指示设置了哪些位 - 但我认为这不会有用对你来说,除了它在记录枚举是一个标志枚举的作用。

但是,无论是否存在[Flags]属性,Enum.HasFlag()都会告诉您该标志是否已设置。

此示例控制台应用应该清楚说明:

using System;

namespace Demo
{
    [Flags]
    enum Status
    {
        None     = 0,
        Status1  = 1,
        Status2  = 2,
        Status3  = 4,
        Status4  = 8,
        Status5  = 16,
        Status6  = 32,
        Status7  = 64,
        Status8  = 128,
        Status9  = 256,
        Status10 = 512,
        Status11 = 1024
    }

    class Program
    {
        static void Main()
        {
            Status s = (Status)1035;

            Console.WriteLine(s); // "Status1, Status2, Status4, Status11"

            if (s.HasFlag(Status.Status4))               // "Status 4 is set"
                Console.WriteLine("Status4 is set");
            else
                Console.WriteLine("Status4 is not set");

            if (s.HasFlag(Status.Status3))               // "Status 3 is not set"
                Console.WriteLine("Status3 is set");
            else
                Console.WriteLine("Status3 is not set");
        }
    }
}

注意:您的枚举似乎缺少某些值! 1024值应为Status11,而不是Status8。

另请注意,我为完整性添加了“无”值。

答案 1 :(得分:1)

按位运算符可用于此问题。 (1<< i)给出2的功率" i"。然后使用"值"按位AND(&);当且仅当在"值"中存在2的相应幂时,给出非零数字。

public static void GetFlags(int value)
{
    for (int i = 0; i < 20; i++)
    {
        if (((1 << i) & value) > 0)
            Console.WriteLine($"Status {i + 1} is present");
    }
}

答案 2 :(得分:0)

您可以使用[Flags]属性执行此操作:

[Flags]
enum bla {
  foo = 1,
  bar = 2,
  baz = 4
}

public void Foo() {
  bla flag = (bla)3; // Flags foo and bar
  int andBackToInt = (int)flag; // 3

}

答案 3 :(得分:0)

感谢大家的快速回复,真的很感激! : - )

该属性对我而言是新的。第三方枚举没有标记属性,这就是为什么枚举的Ctype没有返回所有值。所以我最终复制了所有的枚举值(通过对象浏览器很容易)并创建一个带有flags属性集的本地枚举。现在它就像我希望的那样转换!

全部谢谢!