我有这样的枚举声明:
public enum Filter
{
a = 0x0001;
b = 0x0002;
}
Run Code Online (Sandbox Code Playgroud)
那是什么意思?他们用它来过滤数组.
Jon*_*eet 10
这意味着它们是分配给这些名称的整数值.枚举基本上只是命名数字.您可以在枚举的基础类型和枚举值之间进行转换.
例如:
public enum Colour
{
Red = 1,
Blue = 2,
Green = 3
}
Colour green = (Colour) 3;
int three = (int) Colour.Green;
Run Code Online (Sandbox Code Playgroud)
默认情况下,一个枚举的基础类型int,但是你可以使用任何的byte,sbyte,short,ushort,int,uint,long或ulong:
public enum BigEnum : long
{
BigValue = 0x5000000000 // Couldn't fit this in an int
}
Run Code Online (Sandbox Code Playgroud)
它只是意味着如果你做Filter-> a,你得到1. Filter-> b是2.
奇怪的十六进制表示法只是表示法.
编辑:由于这是一个'过滤器',十六进制表示法更有意义.
通过写入0x1,指定以下位模式:
0000 0001
Run Code Online (Sandbox Code Playgroud)
而0x2是:
0000 0010
Run Code Online (Sandbox Code Playgroud)
这使得如何使用过滤器更加清晰.
因此,例如,如果要过滤掉设置了较低2位的数据,您可以执行以下操作:
Filter->a | Filter->b
Run Code Online (Sandbox Code Playgroud)
这将对应于:
0000 0011
Run Code Online (Sandbox Code Playgroud)
十六进制表示法使过滤器的概念更清晰(对某些人来说).例如,通过观察它可以相对容易地找出0x83F0的二进制数,但对于33776(基数10中的相同数字)则要困难得多.
不清楚你觉得不清楚的是什么,所以让我们讨论一下:
枚举值已被赋予明确的数值。每个枚举值始终表示为底层存储的数值,但如果您想确定该数值是什么,则必须指定它。
数字以十六进制表示法书写,当您希望数值包含一个用于屏蔽的设置位时,通常会使用这种表示法。与写入 32768 相比,写入 0x8000 时该值仅设置了一位更容易看出。
在您的示例中,它不像您只有两个值那么明显,但是对于位过滤,每个值代表一个位,因此每个值是前一个值的两倍:
public enum Filter {
First = 0x0001,
Second = 0x0002,
Third = 0x0004,
Fourth = 0x0008
}
Run Code Online (Sandbox Code Playgroud)
您可以使用这样的枚举来过滤掉值中的单个位:
If ((num & Filter.First) != 0 && (num & Filter.Third) != 0) {
Console.WriteLine("First and third bits are set.");
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
14171 次 |
| 最近记录: |