c# - maj gauche l'ensemble d'un tableau d'octets
En C#, il est un moyen pour la droite/la gauche maj tout un tableau d'octets (et par la suite l'ajout d'un octet à un particulier, pour que le dernier bit n'est pas perdu)?
Je sais que cela sonne comme une étrange demande, mais je voudrais encore savoir si ses possible et/ou de la façon de commencer à le faire.
- Oui: c'est possible. Non: il n'est pas standard. Approche: Appliquer la maj à chaque octet, avec report. Peut nécessiter la création d'une nouvelle matrice, selon étendre la sémantique.
- Je pense que vous devriez re-créer votre commentaire est une réponse
- Si vous l'utilisez .NET 4, vous pouvez être en mesure d'utiliser
BigInteger
. - Voulez-vous dire de changement au niveau des bits individuels (par exemple, "shift chaque octet par 3 bits avec un report") ou maj tout un octet à la fois (par exemple, "ajouter un autre octet à l'avant/à la fin")? J'ai supposé que l'ancien au début, mais maintenant...
- J'ai le sentiment que c'est sur le bit-shifting. Je cherchais byte-shifting. J'ai donc été à la recherche pour vérifier si
Array.Copy()
est ok pour ce que je faisais. Quoi que ce soit.
Vous devez vous connecter pour publier un commentaire.
Oui, vous le pouvez. Consultez les méthodes suivantes, j'ai écrit:
workRegister
signé de toute façon, lorsque vous ne voulez pas signer de propagation?)Juste pour sourire. déplacement et rotation des octets dans un tableau d'octets. (pas bitshifting)
décale à gauche, zéro de remplissage:
mybytes.Skip(1).Concat(new byte[] { 0 }).ToArray();
décalage à droite, zéro de remplissage:
(new byte[] {0}).Concat(mybytes.Take(mybytes.Length - 1)).ToArray();
rotation à gauche:
mybytes.Skip(1).Concat(mybytes.Take(1)).ToArray();
rotation à droite:
mybytes.Skip(mbytes.Length - 1).Concat(mbytes.Take(mbytes.Length - 1)).ToArray();
Skip
.Il semble que vous effectuez des opérations sur les bits sur la grande quantité de bits de les stocker dans un tableau d'octets. Pensez à utiliser BitArray classe et BitVector32 Structure. En fonction de ce que vous faites avec des morceaux vous pouvez créer une classe de ce genre. Notez que le changement fonctionne en O(1) au lieu de O(n).
BitArray
ne fournit pas de déplacement des opérateurs ou des méthodes.BitArray
vous pouvez stocker un pointeur vers le début de l'indice dans un entier. Décalage serait - ajout d'un élément à la fin et en déplaçant le pointeur de début par une. Ce serait le travail en O(1). À l'aide deBitArray
pourrait être une bonne idée si vous avez une série d'opérations sur les bits et pas seulement un quart de travail.Linq façon:
Je ne pense pas qu'il y a un moyen intégré. J'ai mis en place l'opération de déplacement à gauche de vous décrit ci-dessous (en supposant que little endian). Ce n'est pas tout à fait aussi élégant que vous pouvez faire avec x86 assemblée (maj à effectuer des instructions), mais assez proche de ce que vous pourriez faire avec C.
Alternativement, vous pouvez l'utiliser presque la BigInteger struct (.NET 4 et ci-dessus) qui a un constructeur qui prend un tableau d'octets et un ToByteArray méthode. Mais son virage à gauche de l'opération de connexion s'étend l'octet de poids fort et de son décalage à droite de l'opération tronque. Donc, vous auriez besoin de compenser à la fois pour obtenir le comportement exact que vous avez décrit.
J'ai donné un peu plus pensé et réalisé que c'est probablement ce qui correspond à la question mieux:
Une technique similaire peut être appliquée pour effectuer la maj de droite.
Shift gauche:
Décalage à droite: