2010-11-05 21 views
3

Existe-t-il une alternative BitArray pour .NET Micro Framework? Je pensais simplement utiliser un bool [], mais comment pouvez-vous le convertir en octet []?Alternative à BitArray pour le .NET Micro Framework

Dans le cadre complet, compte tenu de « bits » est un BitArray, les travaux suivants:

byte[] data = new byte[dimensions/8]; 
bits.CopyTo(data, 0); 

Mais je ne peux pas sembler trouver la classe BitArray dans le micro cadre

+1

De quoi avez-vous besoin exactement? Peut-être qu'un «byte» que vous pouvez manipuler est-il suffisant? – Bobby

+0

BitArray est implémenté en utilisant des entiers et des opérateurs bit à bit. –

+0

@Bobby non vraiment besoin de fonctionner au niveau du bit :-) – TimothyP

Répondre

5

Il est pas très difficile à dupliquer la fonctionnalité de BitArray. Tout d'abord, si vous avez besoin de moins de 65 bits, alors vous pouvez le faire avec un long ou plus petit.

Pour définir un bit individuel:

void Set(ref long ba, int bit) 
{ 
    ba |= 1L << bit; 
} 

Pour effacer un peu:

void Clear(ref long ba, int bit) 
{ 
    long mask = 1L << bit; 
    mask = ~mask; 
    ba &= mask; 
} 

Pour voir si un bit est:

bool IsSet(long ba, int bit) 
{ 
    long mask = 1L << bit; 
    return (ba & mask) != 0; 
} 

Si vous avez plus de 64 bits, alors vous devrez créer un tableau (byte[], probablement), et faire la division pour déterminer quel octet/bit vous voulez dify. Les méthodes ci-dessus fonctionneront, à condition que vous changiez le long en byte.

Par exemple, si vous avez:

byte[] myBytes = new byte[128]; 

Vous avez 1024 bits.

Pour définir un bit:

void Set (int bit) 
{ 
    int byte = bit/8; 
    int bitIndex = bit%8; 
    myBytes[byte] |= (byte)(1 << bitIndex); 
} 

Les autres méthodes utilisent le même calcul pour obtenir l'octet et l'indice de bits, et le réglage, la compensation et le test d'un bit est le même que l'exemple long ci-dessus.

+0

Awesome! Je vous remercie ! – TimothyP

+2

Si 'Interlocked.CompareExchange' est disponible sur le micro-framework, on pourrait l'utiliser pour rendre n'importe quel type d'opérations binaires atomiques. Dans une boucle, lisez l'ancienne valeur du mot, calculez une nouvelle valeur et 'CompareExchange' l'ancienne valeur du nouveau; reloop jusqu'à ce que 'CompareExchange' réussisse. Personnellement, j'aime avoir une méthode atomique pour calculer 'Thebits = (TheBits & ~ Mask)^NewBits)'. Les bits qui sont clairs dans 'Mask' et' NewBits' sont laissés seuls; ceux qui sont clairs dans 'Mask' et définis dans' NewBits' sont basculés. Les bits définis dans 'Mask' seront copiés à partir de' NewBits'. – supercat

2

Vous pouvez trouver une implémentation BitArray dans la pile 802.15.4. Il suffit de rechercher le kit de portage pour BitArray.cs