2016-01-20 101 views
0

我試圖理解的代碼的一部分,但無法理解它爲止......看不慣枚舉標誌與0X2值

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = 0x3, 
    Dew = 0x4, 
    Wine = 0x5 
} 


Products pp = (Products)12; 
pp.HasFlag(Products.Dew); ==> True 
pp.HasFlag(Products.Miranda); ==> False 
pp.HasFlag(Products.Coca); ==> False 

我想知道爲什麼pp.HasFlag(Products.Dew)Truepp.HasFlag(Products.Miranda)False。我以爲它正在工作爲0x1 = 1,0x2 = 2,0x3 = 4,0x4 = 8,0x5 = 16。請指導我正在發生什麼

+0

我真的不明白了一個道理,以downvote這個問題。至少沒有說明原因... – nozzleman

回答

1

你最初的聲明等於

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = Coca | Pepsi, // equals to 0x3 since 0x3 == 0x2 | 0x1 
    Dew = 0x4, 
    Wine = Dew | Pepsi  // equals to 0x5 since 0x5 == 0x4 | 0x1 
} 

你可能想

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = 0x4, 
    Dew = 0x8, 
    Wine = 0x10 
} 
4

您誤解了0x的含義。 0x5不等於16,它等於5 0x讓你寫的十六進制,讓你可以寫0xA = 10

改變你的定義是:

public enum Products 
{ 
    Pepsi = 1, 
    Coca = 2, 
    Miranda = 4, 
    Dew = 8, 
    Wine = 16 
} 

因此,12將代表標誌DewMiranda

+0

HasFlag(Products.Dew)是真的嗎? –

+2

@WaqarAhmed是的,因爲'12'代表'8 + 4'(這是露和米蘭達)。 – Rob

+0

根據我的代碼爲什麼pp.HasFlag(Products.Dew)是True並且pp.HasFlag(Products.Miranda)是False? –

0

你應該閱讀this topic。 你的標誌有點不正確。例如:

Pepsi | Cola = Miranda 
0001 | 0010 = 0011 

邏輯上正確的標誌:

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, 
    Coca = 0x2, 
    Miranda = 0x4, 
    Dew = 0x8, 
    Wine = 0x0A 
} 
0

爲了瞭解Flags最好是每個標誌值轉換爲它的二進制表示。所以你的情況,我們有:

[Flags] 
public enum Products 
{ 
    Pepsi = 0x1, //--> 0001 
    Coca = 0x2, //--> 0010 
    Miranda = 0x3, //--> 0011 
    Dew = 0x4, //--> 0100 
    Wine = 0x5 // --> 0101 
} 

那麼當12(在二進制爲「1100」)鑄造到Products枚舉,你可以清楚地看到,露標誌位(這是0100)是(或1二進制)。換句話說,每個右邊第三位的產品都有露水。