Redistribuer les bits les moins significatifs à partir d'une matrice de 4 octets à un quartet

StackOverflow https://stackoverflow.com/questions/8802893

  •  25-10-2019
  •  | 
  •  

Question

Je souhaite déplacer les bits 0,8,16,24 d'une valeur de 32 bits pour les bits 0,1,2,3 respectivement. Tous les autres bits de l'entrée et la sortie sera zéro.

Il est évident que je peux le faire comme ceci:

c = c>>21 + c>>14 + c>>7 + c;
c &= 0xF;

Mais est-il un moyen plus rapide (moins d'instructions)?

Était-ce utile?

La solution

c = (((c&BITS_0_8_16_24) * BITS_0_7_14_21) >> 21) & 0xF;

Ou attendre pour le processeur Intel Haswell, faisant tout cela exactement une instruction (pext).

Mise à jour

La prise en compte clarified constraints et en supposant 32-bit unsigned values, le code peut être simplifié à ceci:

c = (c * BITS_7_14_21_28) >> 28;
scroll top