VB.NET枚举声明语法

时间:2011-10-28 20:22:02

标签: enums

我最近看到了枚举的声明,如下所示:

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

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

End Enum

我想知道是否有人可以解释“&lt;&lt;”语法做或用于什么?谢谢......

2 个答案:

答案 0 :(得分:3)

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 <&lt; 0)并且(5&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;

因此,您可以使用按位AND运算符确定SiteRole,如上所示:

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

当然,您也可以使用按位OR运算符设置SiteRole,如上所示:

UInt32 SiteRole = 0x00000000;
SiteRole |= ADMIN;

真正的问题是为什么ADMIN和REGULAR具有相同的值?也许这是一个错误。

答案 1 :(得分:1)

这些是按位移位操作。按位移位用于将枚举量的整数值转换为不同的数字。每个枚举成员实际上将具有位移值。这可能是一种混淆技术,与为每个枚举成员设置固定的整数值相同。

每个整数都有一个二进制reprsentation(如0111011);位移允许位移动到左(&lt;&lt;)或右(&gt;&gt;),具体取决于使用哪个运算符。

例如:

10&lt;&lt; 0表示: 1010(以二进制形式的10)移动,剩下0位是1010

5&lt;&lt; 1表示: 101(5以二进制形式)向左移动一位= 1010(向右添加零) 所以5&lt;&lt; 1是10(因为1010代表数字10)

等等。

通常,x <&lt;&lt; y操作可以看作是计算x * Pow(2,y);

的快速方法

您可以阅读本文,了解有关.NET http://www.blackwasp.co.uk/CSharpShiftOperators.aspx

中位移的更多详细信息