我有两个位域,一个是8位,另一个是4位。
[Flags]
public enum Bits1 {
A = 1,
B = 2,
C = 4,
D = 8,
E = 16,
F = 32,
G = 64,
H = 128
}
[Flags]
public enum Bits2 {
I = 1,
J = 2,
K = 4,
L = 8
}
我需要将Bits1中的位映射到Bits2,如下所示:
Bits2 = Map(Bits1)
例如,假设A和C映射到J,B映射到空,D映射到映射中的I,ABCD(值为13),在通过map函数后,返回IJ(值为3)
应该能够根据需要以编程方式设置和更改地图。这听起来像是Dictionary可以做的事情,但我不知道如何设置它。在C#中实现这一目标的最佳方法是什么?
答案 0 :(得分:1)
最好的方法就是这样。使用数组,其中输入是数组的索引,并输出数组的值:
public Bits2 Map(Bits1 input)
{
return _mapping[(int) input];
}
然后您必须按如下方式定义 16映射(这只是一个示例):
private static Bits2[] _mapping = new Bits2[16]() {
Bits2.I | Bits2.J, // this is index 0, so all Bits1 are off
Bits2.K, // this is index 1, so all but A are off
Bits2.I | Bits2.L, // this is index 2, so all but B are off
Bits2.J | Bits2.K, // this is index 3, so all but A | B are off
// continue for all 16 combinations of Bits1...
};
该示例显示了如何编码前4个映射:
none -> I | J
A -> K
B -> I | J
A | B -> J | K
答案 1 :(得分:0)
你是什么意思
应该能够根据需要以编程方式设置和更改地图。 对我来说,似乎映射是通过枚举的定义来修复的。在您的问题中,如果
Bits2
中缺少某些标志,则不指定代码的行为方式。事实上,如果您不需要检测缺失值,可以像这样定义Map
函数:
public Bits2 Map(Bits1 input)
{
return (Bits2)(int)input;
}
当然,如果您需要检测缺失值,那么您可以查看Enum
类方法......