2016-08-10 10 views
3
で動作しない
enum WeekDays 
{ 
    Monday = 0, 
    Tuesday = 1, 
    Wednesday = 2, 
    Thursday = 3, 
    Friday = 4, 
    Saturday = 5, 
    Sunday = 6 
} 

private void button4_Click(object sender, EventArgs e) 
{ 
    WeekDays days0 = WeekDays.Monday | WeekDays.Tuesday | WeekDays.Wednesday; 

    WeekDays days1 = WeekDays.Monday | WeekDays.Tuesday | WeekDays.Wednesday | WeekDays.Thursday; 

    WeekDays days2 = WeekDays.Monday | WeekDays.Tuesday | WeekDays.Wednesday | WeekDays.Thursday | WeekDays.Friday; 
} 

出力は次のとおりです。がどのようにビット単位の演算子を列挙

days0 = Thursday, 
days1 = Thursday, 
days2 = 7 

誰もが、これはどのように動作するかのロジックを説明できますか?

答えて

11

基本的に、列挙型はビット単位の操作では使用できません。ビット単位の演算に適しているためには、それぞれ異なる値を別のビットで表す必要がありますが、数字は0から6までです。

あなたが持っている出力を取得している理由は、ということです。

  • days0Thursday
  • days1の値は、まだ3であるThursdayの値0 | 1 | 2 | 3で、3である、0 | 1 | 2です
  • days2は、あなたの列挙型で名前付きの値ではありませんこれは、7である0 | 1 | 2 | 3 | 4ある
[Flags] // Affects string parsing and formatting 
enum BitwiseWeekDays 
{ 
    None = 0, 
    Monday = 1 << 0, 
    Tuesday = 1 << 1, 
    Wednesday = 1 << 2, 
    Thursday = 1 << 3, 
    Friday = 1 << 4, 
    Saturday = 1 << 5, 
    Sunday = 1 << 6 
} 

今すぐ各値は別々のビットで表現されるので、あなたは「または」彼らはそれらを一緒に結合することができます:3210

は、あなたがこのようにそれを宣言する必要があり、ビット演算のためのあなたの列挙型の作業が適切にするには。

4
0 | 1 | 2 = (bitwise 00 | 01 | 10 = 11) = 3 
0 | 1 | 2 | 3 = (bitwise 00 | 01 | 10 | 11 = 11) = 3 
0 | 1 | 2 | 3 | 4 = (bitwise 000 | 001 | 010 | 011 | 100 = 111) = 7 
関連する問題