无法理解具有 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)
是 True
而 pp.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
代表标志 Dew
和 Miranda
你应该阅读 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
}
我正在尝试理解一部分代码,但到目前为止还无法理解...
[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)
是 True
而 pp.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
代表标志 Dew
和 Miranda
你应该阅读 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
}