我最近看到了枚举的声明,如下所示:
<Serializable()>
<Flags()>
Public Enum SiteRoles
ADMIN = 10 << 0
REGULAR = 5 << 1
GUEST = 1 << 2
End Enum
我想知道是否有人可以解释“&lt;&lt;”语法做或用于什么?谢谢......
答案 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
中位移的更多详细信息