6
votes

Bitarray - Bits de quart

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?

Merci!


0 commentaires

5 Réponses :


6
votes

Cet extrait simple montre une façon manuelle de le faire. La valeur de bitarray [0] est écrasée: xxx

en faisant une méthode d'extension ne devrait pas être une grosse affaire.


2 commentaires

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 à un bool [] et de copier les données à un autre bool [] compensations. Enfin, vous pourriez recréer votre bitarray à partir du BOOL [] . Mais je doute que ce soit plus rapide que d'accéder à chaque élément pour vos ~ 3000 bits.



0
votes

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.


0 commentaires

2
votes

System.numerics.biginteger prend effectivement le décalage de bits.


2 commentaires

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é.



2
votes

Je ne suis pas sûr de savoir comment de l'efficacité mais cette méthode d'extension fait le travail xxx


2 commentaires

OP a demandé un changement à gauche. J'ai aimé cela, alors voici une version de changement de vitesse: retournez le nouveau bitarray ((instance.cast () .Toarray ());


En effet. Merci :)



1
votes

recréer bitarray vous-même comme enveloppe autour de ulong [] ; 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).


0 commentaires