Je me demandais de quoi le moyen le plus efficace d'inverser l'ordre d'un biparray en C #. Pour être clair, je ne veux pas inverser le bitarray en appelant. Not (), je veux inverser l'ordre des bits dans la matrice. P>
acclamations, Chris P>
6 Réponses :
public void Reverse(BitArray array) { int length = array.Length; int mid = (length / 2); for (int i = 0; i < mid; i++) { bool bit = array[i]; array[i] = array[length - i - 1]; array[length - i - 1] = bit; } }
S'il vous plaît ajouter ceci au code de dotnet officiel quelqu'un
Pour une gamme longue et une relative quelques utilisations, il suffit d'envelopper:
class BitArrayReverse { private BitArray _ba; public BitArrayReverse(BitArray ba) { _ba = ba; } public bool this[int index] { get { return _ba[_ba.Length - 1 - index]; } set { _ba[_ba.Length - 1 - index] = value; } } }
+1 Nice. Pas vraiment une réponse mais une option intelligente pour certaines situations.
D'autre part, si les données sont seulement em> 8 Un peu (jamais) et "la performance est importante", pourquoi utiliser un bittharray du tout? Un bitarray pourrait toujours être utilisé pour les fonctionnalités agréables, telles que "exploser" à un énumérable tandis que c # a déjà une manipulation de bits d'octet décente intégrée. P> supposant qu'un cas plus général que les données sont 8 bits alignés ... mais d'une certaine longueur indéterminée em> p> est-ce réellement mieux (plus rapide, plus efficace, etc.) que de le faire "par article" dans le bitarray? Je n'ai aucune idée forte> mais suspect non. Je commencerais certainement avec les méthodes "simples" - ceci est ici comme une preuve de concept et peut (ou peut ne pas être) intéressant de comparer dans une référence. Quoi qu'il en soit, écrire pour la clarté d'abord em> ... et le ci-dessous n'est pas ça! (Il y a au moins un bogue dedans - je blâme la complexité supplémentaire; -) p> sortie: p> Le octet code> une recherche est probable le moyen le plus rapide. Les frais généraux supplémentaires de Bitset pour obtenir / définir les données peuvent toutefois annuler la prestation de recherche. De plus, le coût de construction initial et les frais généraux persistants doivent être pris en compte (mais les valeurs peuvent être codées dans une matrice littérale ... Ick!)
expr.dump () code> est un fonctionnalité LINQPAD . P> < / p>
Ce sera le meilleur moyen Pour inverser MSB LSB de n'importe quelle longueur à l'aide de XOR dans la boucle pour la boucle
public static BitArray BitsReverse(BitArray bits) { int len = bits.Count; BitArray a = new BitArray(bits); BitArray b = new BitArray(bits); for (int i = 0, j = len-1; i < len; ++i, --j) { a[i] = a[i] ^ b[j]; b[j] = a[i] ^ b[j]; a[i] = a[i] ^ b[j]; } return a; } // in 010000011010000011100b // out 001110000010110000010b
Vous triple la consommation de mémoire et vous attribuez des opérations. Comment cela peut être efficace?
Dim myBA As New BitArray(4) myBA(0) = True myBA(1) = False myBA(2) = True myBA(3) = True Dim myBoolArray1(3) As Boolean myBA.CopyTo(myBoolArray1, 0) Array.Reverse(myBoolArray1) myBA = New BitArray(myBoolArray1)
Adapté la réponse de @timloyd et l'a transformée en une extension pour une utilisation plus facile. Utilisation: p> var bits = new BitArray(some_bytes).Reverse();
Que diriez-vous d'utiliser (la lecture) en arrière?
Oui, la taille est fixe (8 bits)