代码之家  ›  专栏  ›  技术社区  ›  Gforse

按位组合作为要枚举的整数

  •  0
  • Gforse  · 技术社区  · 6 年前

    目前,我正试图解析一个整数,它是从第三方API到枚举的按位组合。例如:我收到一个 integer 有价值的 1035 此值包含三个枚举值;

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

    所以我需要一个函数来转换 一千零三十五 Status 1 + Status 2 + Status 4 + Status 8

    试图将其转换为位,然后使用位移位,但这并没有给我正确的结果…希望有人能在C或VB.NET示例中帮助我。

    4 回复  |  直到 6 年前
        1
  •  2
  •   Matthew Watson    6 年前

    如果你申请 [Flags] 属性,它将使枚举 ToString() 返回一个字符串,该字符串指示设置了哪些位,但我认为这对您没有多大用处,除了它在记录枚举是标志枚举方面的作用。

    但是,不管 [旗帜] 属性, 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。

    还要注意,为了完整性,我添加了一个“none”值。

        2
  •  1
  •   L_J    6 年前

    位运算符可用于此问题。(1<<i)给2个幂“i”。然后,如果且仅当“值”中存在二的相应幂,则带“值”的按位和(&)将给出非零数。

    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");
        }
    }
    
        3
  •  0
  •   JAD    6 年前

    你可以用 [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
    
    }
    
        4
  •  0
  •   Gforse    6 年前

    谢谢大家的快速回复,非常感谢!-)

    这个属性对我来说是新的。第三方枚举没有标志a属性,这就是为什么要枚举的ctype没有返回所有值的原因。因此,我最终复制了所有枚举值(通过对象浏览器很容易实现),并创建了一个带有flags属性集的本地枚举。现在它像我希望的那样转变了!

    谢谢大家!