décalage en boucle d'une valeur - C - Programmation
Marsh Posté le 17-06-2009 à 11:09:00
faut decaler a droite de X, à gauche de Nbits-X et faire un OU logique
Marsh Posté le 17-06-2009 à 11:26:44
Zarine a écrit : Je cherche à faire un décalage en boucle d'une valeur. |
Ca s'appelle une rotation ... On ne sait pas le faire directement en C standard, mais on peut le coder... un peu lourdingue ...
Citation : Que je connais pas les fonction assembleurs disponibles ou non de mon processeur et que je sais pas si le compilateur dédié supporte de manger de l'assembleur. |
Alors renseigne toi, car c'est certainement la meilleure solution. Je doute que la solution C soit traduite directement par une instruction assembleur (Rotation à droite ou a gauche, avec ou sans retenue etc.), à moins que ton compilateur soit TRES performant.
Marsh Posté le 17-06-2009 à 12:43:44
Emmanuel Delahaye a écrit : Alors renseigne toi, car c'est certainement la meilleure solution. Je doute que la solution C soit traduite directement par une instruction assembleur (Rotation à droite ou a gauche, avec ou sans retenue etc.), à moins que ton compilateur soit TRES performant. |
Pareil. En général ce type d'instruction c'est réalisé comme un appel à du code assembleur très simple. Si en plus des contraintes que tu as énuméré (nb de cycles, etc), ton compilo n'est pas capable d'appeler du code assembleur, reste plus que la pendaison ou la noyade comme solution.
A+,
Marsh Posté le 17-06-2009 à 15:32:32
gcc traduit
Code :
|
avec l'instruction de rotation du processeur depuis au moins la 2.95 (j'ai pas plus vieux pour tester), mais ne traduit pas l'équivalent avec un nombre de rotation variable avec l'instruction assembleur pourtant existante.
Marsh Posté le 17-06-2009 à 15:39:10
Un Programmeur a écrit : gcc traduit
|
Alors il n'y a plus qu'à essayer sur la cible du P.O.
Marsh Posté le 17-06-2009 à 10:42:49
Je cherche à faire un décalage en boucle d'une valeur.
Par exemple :
10101010 décalé vers la droite 1 fois donnerait : 01010101 (classique avec X>>1)
10101010 décalé vers la gauche 1 fois donnerait : 01010101 (pas classique avec X<<1)
10101010 décalé vers la droite 8 fois donnerait : 10101010
En sachant que :
Je suis sur matériel embarqué avec peu de bibliothèque disponible (même pas de stdio par exemple, même si j'ai un équivalent)
Que je peux faire une fonction sans problème tant que ça prend pas trop de place (je suis limité à 32 ko et mon programme est déjà assez long (1000 lignes) et prend 23 ko et risque de grossir encore)
Et si c'est lourd comme solution (plus de 5 cycles CPU) je passe.
Que je connais pas les fonction assembleurs disponibles ou non de mon processeur et que je sais pas si le compilateur dédié supporte de manger de l'assembleur.
Message édité par Zarine le 17-06-2009 à 10:45:22