J'ai un article arbitraire Je dois échanger toutes les paires de bits comme: p>
Avant d'échanger: On m'a demandé cela dans une interview! p> 11101101 CODE> P>
11-10-11-01 code>
Après échange:
11-01-11-10 code> p>
6 Réponses :
b = (a & 170 >> 1) | (a & 85 << 1)
C'est totalement illisible; De plus, il est inefficace et même incorrect pour les cas de bord. La division par deux n'est pas équivalente à un changement de droite un peu pour les nombres négatifs.
Identique que les TDammers répondent, mais c'est plus propre et explicitement binaire, pendant que vous utilisez des nombres décimaux.
Je voudrais d'abord coder cela «Longhand» - c'est-à-dire de plusieurs étapes évidentes et explicites, et utilisez-la pour valider que les tests d'unité que j'avais mis en place fonctionnaient correctement, puis ne vous déplacez que dans plus de solutions de manipulation de bits ésotériques. Si j'avais besoin de performance (et que des performances supplémentaires ont été livrées par ces améliorations) p>
code pour les personnes d'abord, Ordinateurs de seconde. P>
en pseudo-code: Il fonctionne en manipulant les bits faibles et les bits élevés de chaque paire de bits séparément, puis combinant le résultat: p> Étant donné que toutes les langues ne vous permettent pas d'écrire directement des littéraux binaires, vous pouvez les écrire par exemple hexadecimal: p>
x & 0b10101010 code> extrait le bit haut de chaque paire, puis
>> 1 code> le décalage vers la position basse bit. li>
(x & 0b01010101) << 1 code> extrait le bit bas de chaque paire et la déplace vers la position de bits élevée. Li>
Étant donné que toutes les langues ne respectent pas le modèle 0b ..., il convient probablement de noter que c'est 0xaa et 0x55 dans Hex respectivement.
@userx: +1 Oui, c'est certainement la peine de noter. Ajoutée.
Merci Mark. C'est une méthode géniale!
10101010 code> et 01010101 code>). LI>
- Utilisez le bitwise-et pour filtrer l'entrée en deux nombres, l'un ayant tous les morceaux même à zéro, l'autre ayant tous les bits inégaux à zéro. li>
- Décaler le numéro qui ne contient que même des bits un bit à gauche et l'autre un un peu à droite li>
- Utilisez Bitwise-ou pour les combiner ensemble. Li>
Exemple pour 16 bits (pas code réel): p> xxx pré> ol>
Euh .. je pense que vous voulez dire 0xaa au lieu de 0x10101010 (0xaa étant 10101010 en binaire) et 0x55 au lieu de 0x01010101. Bien pour un octet quand même. 0xaaaa et 0x5555 respectivement pour un court-circuit.
Ouais, déjà édité le pseudocode de type C à utiliser binaire à la place. La question originale indique de toute façon 8 bits, alors ...
La solution la plus élégante et la plus flexible est que d'autres, d'appliquer un masque «peigne» aux bits paires et aux bits impairs séparément, puis les ont déplacés à gauche et à droite un endroit pour les combiner à l'aide de Bitwise ou.
Une autre solution que vous voudrez peut-être penser à tirer parti de la taille relativement petite de votre type de données. Vous pouvez créer une table de recherche de 256 valeurs initialement initialisée aux valeurs que vous souhaitez comme sortie à votre entrée: p> Chaque valeur est placée dans la matrice pour représenter le tableau pour représenter transformation de l'index. Donc si vous faites cela: p> C'est plus Cumbersomeome et moins flexible que la première approche (que si vous voulez passer de 8 bits à 16?) Mais cela a-t-il l'approche qu'il sera plus rapide si l'exécution d'un grand nombre de ces opérations. P> P> out code> contiendra
0x55 code> p>
Supposons que votre numéro soit Trouvez d'abord le bit de la position même: deuxième étape Trouver la position impaire: 3ème étape Changement de position Position d'une position impaire à un peu de position et même de position à un peu de position impairs: dernière étape ... Résultat d'impression p> num code>. p>
num & oxaaaaaaaa code> p>
num & ox55555555 code> p>
Même = (Num & Oxaaaaaaaaa) >> 1 Code>
impair = (num & 0x55555555) << 1 code> p>
résultat = même | Impair code> p>
Désolé pour la première réponse que j'ai donnée si cela vous a confondu. Je lis complètement votre avant / après tort.
@Jamesm: Désolé, si ce n'est pas évident, mais la question est la suivante: dans un octet, paire des bits pour, par exemple, si l'octet est 10101100, jumelez les bits à ressembler -
10 - 10 - 11 - 00 code>. Maintenant, si nous échangeons les paires individuelles, cela deviendrait -
01 - 01 - 11 - 00 code>. J'avais besoin du mécanisme pour mettre en œuvre l'échange