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а РЕГУЛЯРНЫЕ имеют одинаковые значения?Может быть, это ошибка.