2016-01-20 100 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二进制)。换句话说,每个右边第三位的产品都有露水。