无法理解具有 0x2 值的枚举标志

Couldn't understand Enum Flags with 0x2 values

我正在尝试理解一部分代码,但到目前为止还无法理解...

[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。请指导我发生了什么事

您对 0x 的理解有误。 0x5 不等于 16,它等于 5。0x 让你写十六进制,这样你就可以写 0xA = 10。

将您的定义更改为:

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

因此,12 代表标志 DewMiranda

你应该阅读 this topic。 你的标志有点不正确。例如:

Pepsi | Cola = Miranda
 0001 | 0010 = 0011

逻辑正确的标志:

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

为了理解Flags,最好将每个标志值转换为其二进制表示形式。所以在你的情况下我们有:

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

然后当 12(二进制为“1100”)转换为 Products 枚举时,您可以清楚地看到 Dew 的标志位(即 0100)打开(或二进制为 1)。换句话说,每一个右起第三位为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
}