在C#中将位域映射到另一个位域

时间:2016-08-27 11:43:48

标签: c# dictionary bit-fields bitmask

我有两个位域,一个是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#中实现这一目标的最佳方法是什么?

2 个答案:

答案 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类方法......