我“需要”一种更好的方法来从位掩码生成一个对象集合(一个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 ......
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) };
答案 0 :(得分: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;
}
答案 1 :(得分: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();
答案 2 :(得分:1)
看起来你想要一个带有[Flags]属性的Enum。你会:
[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
答案 3 :(得分: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();