2010-10-22 2 views
3

I «нужен» лучший способом для создания коллекции объектов с битовой маски (а 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

Я размышлял о том случае, когда вам может понадобиться это ... –

ответ

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

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

своп args к Math.Pow ... –

+0

сделано, спасибо Austin. –

1

Это может выглядеть, как вы хотите Enum с [Flags] атрибута. Вы бы:

[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 
Смежные вопросы