2016-05-19 30 views
1

は、なぜ一部の値が角括弧内にあり、1 < < 1を意味するもの:列挙型クラス角括弧

public enum PrivilegeFlags : int 
{ 
    None = 0, 
    [EnumMember(Value = "Agent")] 
    Agent = 1 << 0, 
    [EnumMember(Value = "Campaign")] 
    Campaign = 1 << 1, 
    [EnumMember(Value = "BlackList")] 
    BlackList= 1 << 2, 
All = (1 << 3) - 1 
} 

感謝。

+0

2番目の質問は、http://stackoverflow.com/questions/2493517/what-do-two-left-angle-brackets-mean-in-cの複製です。 – StuperUser

答えて

2

角かっこは、attribute(この場合は具体的にはEnumMemberAttribute)を意味します。また、<<は左シフトを表します。

1

Enumはフラグを作成するためのものです。あなたが列挙型の値がバイナリに変換する場合は、より明確にそれを見ることができます。

public enum PrivilegeFlags : int 
{ 
    None = 0, //0000 0000 
    [EnumMember(Value = "Agent")] 
    Agent = 1 << 0, //0000 0001 
    [EnumMember(Value = "Campaign")] 
    Campaign = 1 << 1, //0000 0010 
    [EnumMember(Value = "BlackList")] 
    BlackList= 1 << 2, //0000 0100 
    All = (1 << 3) - 1 //0000 0111 
} 

EnumMemberPrivilegeFlagsenumメンバーに割り当てられた属性です。以下のように示すように、あなたはenumを宣言する必要はありません

は同じ列挙型である:

public enum PrivilegeFlags : int 
{ 
    None = 0, //0000 0000 
    [EnumMember(Value = "Agent")] 
    Agent = 1, //0000 0001 
    [EnumMember(Value = "Campaign")] 
    Campaign = 2, //0000 0010 
    [EnumMember(Value = "BlackList")] 
    BlackList= 4, //0000 0100 
    All = 7 //0000 0111 
} 

1 << 1はあなたが1の価値を持っていることを意味し、あなたは1の値に1のバイナリ左シフトを行います。これは明らかにバイナリレベルで見られる:

0000 0001 //1 in binary 
--------- << 1 shift left by 1 
0000 0010 //note the binary shift, now this is actually 2 

指定左シフト<<を使用する利点は、増分数を有するフラグ作成することである。0, 1, 2, 3, 4, ...等代わり2^n0のパターン数を有すること。 0, 1, 2, 4, 8, ...