побитовая комбинация как целое число для перечисления - PullRequest
0 голосов
/ 05 июня 2018

В настоящее время я пытаюсь проанализировать целое число, которое является побитовой комбинацией с перечислением от стороннего 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

Пытался преобразовать его в бит и затем использовать битовое смещение, но это не дает мнеправильные результаты ... Надеюсь, кто-нибудь может мне помочь в C # или vb.net примере.

Ответы [ 4 ]

0 голосов
/ 05 июня 2018

Спасибо всем за ваши быстрые ответы, очень ценю это!: -)

Атрибут был новым для меня.У перечисления третьей стороны нет атрибута flags, поэтому перечисление Ctype для перечисления не вернуло все значения.В итоге я скопировал все значения перечислений (через браузер объектов это было легко сделать) и создал локальное перечисление с установленным атрибутом flags.Теперь он конвертируется так, как я надеюсь!

Спасибо всем!

0 голосов
/ 05 июня 2018

Для этой задачи можно использовать побитовые операторы.(1 << i) дает 2 степени «i».Затем поразрядное И (&) со значением «значение» дает ненулевое число в том и только в том случае, если в «значении» присутствует соответствующая степень двойки. </p>

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");
    }
}
0 голосов
/ 05 июня 2018

Если вы примените атрибут [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.

Также обратите внимание, что я добавил значение None для полноты.

0 голосов
/ 05 июня 2018

Вы можете сделать это с атрибутом [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

}
...