2010-10-22 4 views
3

I « besoin » d'une meilleure façon de générer une collection d'objets à partir d'un masque de bits (un ushort passé, sur la forme binaire, il est interprété comme un masque)Retourne une collection d'objets d'un bitmask

Facile, non élégant solution serait:

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

Je méditée d'un cas où vous pourriez avoir besoin de ce ... –

Répondre

6

Essayez le

suivant
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

Merci, cela fonctionne bien mieux que la mise en œuvre de mon piéton – 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

non testé, utilise moins d'itérations que d'autres solutions ;-)

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

échanger les args à Math.Pow ... –

+0

fait, merci Austin. –

1

Il pourrait ressembler à vous voulez un Enum avec l'attribut [Flags]. Vous auriez:

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

Cela vous permet de faire des choses comme

ThingType x = ThingType.THING1 | ThingType.THING3; 

Et aussi

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