Синтаксис объявления перечисления VB.NET - PullRequest
1 голос
/ 29 октября 2011

Недавно я увидел объявление enum, которое выглядит следующим образом:

<Serializable()>
<Flags()>
Public Enum SiteRoles

    ADMIN = 10 << 0
    REGULAR = 5 << 1
    GUEST = 1 << 2

End Enum

Мне было интересно, кто-нибудь может объяснить, что делает синтаксис «<<» или для чего он используется?Спасибо ... </p>

Ответы [ 2 ]

3 голосов
/ 29 октября 2011

ENUM имеет атрибут Flags, который означает, что значения используются в качестве битовых флагов.

Битовые флаги полезны при представлении более одного атрибута в переменной

Это флаги для16-битная переменная (атрибут) (надеюсь, вы видите шаблон, который может продолжаться до количества бит X., ограниченный типом платформы / типа переменной)

BIT1 = 0x1 (1 << 0)
BIT2 = 0x2 (1 << 1)
BIT3 = 0x4 (1 << 2)
BIT4 = 0x8 (1 << 3)
BIT5 = 0x10 (1 << 4)
BIT6 = 0x20 (1 << 5)
BIT7 = 0x40 (1 << 6)
BIT8 = 0x80 (1 << 7)
BIT9 = 0x100 (1 << 8)
BIT10 = 0x200 (1 << 9)
BIT11 = 0x400 (1 << 10)
BIT12 = 0x800 (1 << 11)
BIT13 = 0x1000 (1 << 12)
BIT14 = 0x2000 (1 << 13)
BIT15 = 0x4000 (1 << 14)
BIT16 = 0x8000 (1 << 15)

Чтобы установить бит (атрибут)вы просто используете побитовый или оператор:

UInt16 flags;
flags |= BIT1; // set bit (Attribute) 1
flags |= BIT13; // set bit (Attribute) 13

Чтобы определить бит (атрибут), вы просто используете битовый оператор и:

bool bit1 = (flags & BIT1) > 0; // true;
bool bit13 = (flags & BIT13) > 0; // true;
bool bit16 = (flags & BIT16) > 0; // false;

В приведенном выше примере ADMINи REGULAR - это бит номер 5 ((10 << 0) и (5 << 1) одинаковы), а GUEST - это бит номер 3. </p>

Поэтому вы можете определить SiteRole, используя побитовый оператор AND, как показано выше:

UInt32 SiteRole = ...;
IsAdmin = (SiteRole & ADMIN) > 0;
IsRegular = (SiteRole & REGULAR) > 0;
IsGuest = (SiteRole & GUEST) > 0;

Конечно, вы также можете установить SiteRole с помощью оператора побитового ИЛИ, как показано выше:

UInt32 SiteRole = 0x00000000;
SiteRole |= ADMIN;

Реальный вопрос заключается в том, почему ADMINа РЕГУЛЯРНЫЕ имеют одинаковые значения?Может быть, это ошибка.

1 голос
/ 29 октября 2011

Это битовые операции сдвига.Побитовые сдвиги используются для преобразования целочисленного значения перечислений здесь в другое число.Каждый член перечисления будет иметь значение со сдвигом в битах.Это, вероятно, метод запутывания и такой же, как установка фиксированного целочисленного значения для каждого члена перечисления.

Каждое целое имеет двоичное представление (например, 0111011);сдвиг битов позволяет битам перемещаться влево (<<) или вправо (>>) в зависимости от используемого оператора.

Например:

10 << 0 означает: 1010 (10в двоичной форме) перемещено с 0 битами влево - 1010 </p>

5 << 1 означает: 101 (5 в двоичной форме) перемещен на один бит влево = 1010 (добавлен ноль вправо), поэтому 5 <<1 равно 10 (потому что 1010 представляет число 10) </p>

и т. Д.

В общем, операция x << y может рассматриваться как быстрый способ вычисления x * Pow (2, y); </p>

Вы можете прочитать эту статью для более подробной информации о сдвиге битов в .NET http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...