Opérations de déplacement de bits sur un tableau d'octets en Java
Comment puis-je déplacer un tableau d'octets n positions vers la droite? Par exemple la vitesse d'un 16 tableau d'octets de droite 29 postes? J'ai lu quelque part qu'il peut être fait à l'aide d'une longue? Serait à l'aide d'un long travail comme ceci:
Long k1 = tableau d'octets de 0 à 7
Long k2 = tableau d'octets de 8 à 15
Puis à droite en tournant ces deux longs à l'aide de Long.rotateRight(Long x, le nombre de rotations).Comment les deux aspire à être rejoint dans un tableau d'octets?
OriginalL'auteur k.ken | 2015-03-11
Vous devez vous connecter pour publier un commentaire.
Je crois que vous pouvez le faire à l'aide de java.les mathématiques.BigInteger qui prend en charge se déplace sur arbitrairement grand nombre. Cela a l'avantage de la simplicité, mais l'inconvénient de ne pas rembourrage en original octets taille de la matrice, c'est à dire d'entrée pourrait être de 16 octets de sortie mais peut être seulement de 10 etc, demandant plus de logique.
BigInteger approche
Sortie
Long de manipulation
Je ne sais pas pourquoi vous voulez le faire comme rotateRight (), car cela rend la vie plus difficile, vous avez à vide à les bits qui apparaissent à gauche dans K1 etc. Vous seriez mieux avec l'aide de décalage de l'OMI, comme décrit ci-dessous. J'ai utilisé un décalage de 20 divisible par 4 donc plus facile de voir les amuse-gueules de se déplacer dans la sortie.
1) Utilisation ByteBuffer pour former deux longs à partir de 16 octets du tableau
2) Maj chaque long de n bits vers la droite
Déterminer les bits de k1 qui "s'est retrouvé au large de la pointe"
Rejoindre le K1 transporter des bits sur K2 sur la droite
Écrire les deux longs en arrière dans un ByteBuffer et de l'extrait de comme un tableau d'octets
Confus. Votre entrée est de 2 longs et votre sortie est de 2 longs peu décalé à droite?
Wow, à l'aide de deux longs est beaucoup plus problématique que j'attendais. La raison pour laquelle j'étais curieux de savoir sur l'utilisation de la Nostalgie, c'est que BigInteger de toByteArray ne pas me donner un 16 bits de tableau. J'aurais du pad. De votre long exemple, il n'est pas de rotation circulaire à droite?
J'ai réécrit une réponse à utiliser déplacement plutôt que de la rotation, ce qui simplifie un peu les choses, j'ai également mis à jour avec le problème de ne pas rembourrage de sortie.
Ce qui s'est passé à l'7s? Le résultat final devrait avoir le 7s, non? Le long quart de travail ne semble pas circulaire. Si le 7777 enveloppement à l'avant?
OriginalL'auteur Adam
Voici ce que je suis venu avec de maj d'un tableau d'octets par certains nombre quelconque de bits à gauche:
nope, désolé ...
OriginalL'auteur Matt Wolfe
1. Manuellement en œuvre
Ici sont à gauche et à droite de décalage de la mise en œuvre sans l'aide de
BigInteger
(ie. sans la création d'une copie du tableau d'entrée) et avec unsigned décalage à droite (BigInteger
prend uniquement en charge l'arithmétique des décalages de cours)Décalage à gauche <<
Unsigned Décalage à Droite >>>
Utilisés dans ce classe par cette Projet.
2. À L'Aide De BigInteger
Être conscient que
BigInteger
en interne convertit le tableau d'octets en un int tableau[] si cela peut ne pas être le plus optimisé solution:Arithmétique Décalage à Gauche <<:
Arithmétique Décalage à Droite >>:
3. Bibliothèque Externe
À l'aide de la Octets bibliothèque java*:
Ajouter à pom.xml:
Exemple de Code:
*Avertissement: je suis le développeur.
OriginalL'auteur patrickf
L'est un vieux post, mais je veux mettre à jour Adam réponse.
Le long de la solution fonctionne avec un peu de tweak.
Afin de faire pivoter, utiliser >>> au lieu de >>, car >> tapis de bits significatifs, la modification de la valeur d'origine.
deuxième, la printbyte fonction semble pas manquer de pointe 00 lors de l'impression.
utiliser ce lieu.
OriginalL'auteur Maxi Wu