Pour choisir parmi les nombreuses méthodes possibles, il faut savoir de quoi tu as le plus besoin.
- si c'est la rapidité, alors il vaut mieux faire une LUT de 256 valeurs, c'est encore ce qui s'exécutera le plus vite. Par contre ca consomme un peu plus de mémoire (ca peut avoir son importance sur un petit CPU embarqué).
- si c'est la simplicité, et la taille de code (en mémoire) qui est recherchée, la méthode par décalage est très bien.
- certains CPU ont des instructions assembleur SWAP concues pour ca. Par contre, adieu la portabilité de ton code.
- si on a une vraie rotation de bits (pas juste un décalage avec perte du bit qui dépasse, mais généralement ca va nous ramener aussi à de l'assembleur) on peut faire ce genre de choses :
Si on décompose, ca fait :
000E 000A
H000 D000
00F0 00B0
0G00 0C00
-----------------
HGFE DCBA
Avantages : aucun test, aucune boucle, et on traite 2 bits à chaque fois.
Inconvénients : les constantes (mais sur un RISC elles sont mises avec l'instruction), la rotation qui n'est pas équivalente au décalage en C
[^] # Re: Autres solutions
Posté par Jimmy . En réponse au message Comment effectué une rotation de bit sur un Byte ?. Évalué à 3.
- si c'est la rapidité, alors il vaut mieux faire une LUT de 256 valeurs, c'est encore ce qui s'exécutera le plus vite. Par contre ca consomme un peu plus de mémoire (ca peut avoir son importance sur un petit CPU embarqué).
- si c'est la simplicité, et la taille de code (en mémoire) qui est recherchée, la méthode par décalage est très bien.
- certains CPU ont des instructions assembleur SWAP concues pour ca. Par contre, adieu la portabilité de ton code.
- si on a une vraie rotation de bits (pas juste un décalage avec perte du bit qui dépasse, mais généralement ca va nous ramener aussi à de l'assembleur) on peut faire ce genre de choses :
#define reverse_byte (byte) \
(((byte<<1)&0x11) \
| ((byte<<3)&0x22) \
| ((byte>>3)&0x44) \
| ((byte>>1)&0x88))
Si on décompose, ca fait :
000E 000A
H000 D000
00F0 00B0
0G00 0C00
-----------------
HGFE DCBA
Avantages : aucun test, aucune boucle, et on traite 2 bits à chaque fois.
Inconvénients : les constantes (mais sur un RISC elles sont mises avec l'instruction), la rotation qui n'est pas équivalente au décalage en C
Plus d'infos ici :
http://www.sxlist.com/techref/microchip/math/bit/revbits.htm(...)