J'ai un système.Collections.bitarray (~ 3000 articles) et je voudrais déplacer tous les bits vers la gauche par 1. Cependant, la collection ne semble pas supporter cette opération (c.-à-d. Bitarray << 1 non travailler et il n'y a pas de méthode). Aucune idée sur la façon de faire ça? P>
Merci! P>
5 Réponses :
Cet extrait simple montre une façon manuelle de le faire. La valeur de en faisant une méthode d'extension ne devrait pas être une grosse affaire. P> P> bitarray [0] code> est écrasée:
C'est génial ... mais lent. Je voudrais qu'il y aurait un opérateur ou une méthode spécial puisque nous jouons avec des bits.
Vous pouvez aller très loin de copier le contenu de votre bitarray code> à un
bool [] code> et de copier les données à un autre
bool [] code> compensations. Enfin, vous pourriez recréer votre
bitarray code> à partir du
BOOL [] code résultant>. Mais je doute que ce soit plus rapide que d'accéder à chaque élément pour vos ~ 3000 bits.
La façon la plus simple que j'aurais du haut de ma tête consiste à convertir le Bitarray en une structure de Bigint ou similaire qui prend en charge le décalage et le dos du bit. Maintenant, le BigInteger intégré à .NET 4 ne supporte pas le déplacement, je pense, mais il y en a d'autres qui font, comme la mise en œuvre de Mono. P>
System.numerics.biginteger prend effectivement le décalage de bits. P>
Avec une mise en garde: "Contrairement à l'opération de décalage de goutte à gauche avec des primitives entier, la méthode de gauche conserve le signe de la valeur de BigInteger d'origine." Donc (-3 << 30)! = ((Biginteger) (- 3) << 30)
Et la raison de ceci est un type de biginteger est signé.
Je ne suis pas sûr de savoir comment de l'efficacité mais cette méthode d'extension fait le travail
OP a demandé un changement à gauche. J'ai aimé cela, alors voici une version de changement de vitesse: retournez le nouveau bitarray ((instance.cast
En effet. Merci :)
recréer bitarray vous-même comme enveloppe autour de ulong [] code>; La mise en œuvre des bittshifts par un nombre inférieur à 64 est un morceau de gâteau de cette façon et il faudra moins de temps et tuera moins d'ours polaires que les autres approches suggérées. Par méfication des "bits qui tomberaient de la fin", si vous voulez les garder, vous devrez peut-être développer la matrice (ou non, si elles sont nulles et que vous dites que l'élément non existant maintient implicitement zéro). p>