2010-10-22 80 views
3

我“需要”更好的方式来从一个位掩码生成对象的集合(USHORT过去了,二进制形式在它解释为一个面罩)返回对象的集合,从一个位掩码

最简单的,不优雅解决办法是:

public static Things[] Decode(ushort mask) 
{ 
    switch (mask) 
    { 
     case 1: // 1 
      return new[] { new Thing(0) };  
     case 2: //10 
      return new[] { new Thing(1) }; 
     case 3: // 11 
      return new[] { new Thing(1), new Thing(0) }; 
     case 4: // 100 
      return new[] { new Thing(2) }; 
     case 5: // 101 
      return new[] { new Thing(2), new Thing(0) }; 

// so on ......

+0

我琢磨,你会需要这个...... – 2010-10-22 18:15:02

回答

6

请尝试以下

public static List<Thing> Decode(ushort mask) { 
    var list = new List<Thing>(); 
    for (var index = 0; index < 16; index++) { 
    var bit = 1 << index; 
    if (0 != (bit & mask)) { 
     list.Add(new Thing(index)); 
    } 
    } 
    return list; 
} 
+0

感谢的情形,这工作方式比我的行人更好 – MexDev 2010-10-25 16:05:32

0
List<Thing> Things = new List<Thing>(); 
ushort msk = mask; 
for (int 0 = 0; i < 16; ++i) 
{ 
    if ((msk & 1) != 0) 
    { 
     Things.Add(new Thing(i)); 
    } 
    msk >>= 1; 
} 
return Things.ToArray(); 
1

未经测试,使用比其他解决方案;-)

List<Thing> things = new List<Thing>(); 
for (int n=0;n<4;n++) 
{ 
    int val = Math.Pow(2,i); 
    if ((mask & val) == val) 
    { 
     things.Add(new Thing(val)); 
    } 
} 
return things.ToArray(); 
+1

交换参数Math.Pow ... – 2010-10-22 17:57:03

+0

完成,谢谢奥斯汀。 – 2010-10-25 13:28:57

1

它可能看起来像你想要一个枚举用[标记]属性的迭代更少。你会:

[Flags] 
enum ThingType 
{ 
    THING1 = 1, 
    THING2 = 2, 
    THING2 = 4, 
    THING3 = 8, 
    THING4 = 16 
} 

这可以让你做的事情一样

ThingType x = ThingType.THING1 | ThingType.THING3; 

而且还

int x = 3; 
ThingType y = (ThingType)x; // THING1 | THING2