décalage en boucle d'une valeur

décalage en boucle d'une valeur - C - Programmation

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 cité 1 fois
Message édité par Zarine le 17-06-2009 à 10:45:22
Reply

Marsh Posté le 17-06-2009 à 10:42:49   

Reply

Marsh Posté le 17-06-2009 à 11:09:00    

faut decaler a droite de X, à gauche de Nbits-X et faire un OU logique

Reply

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.

 

Message cité 1 fois
Message édité par Emmanuel Delahaye le 17-06-2009 à 11:27:08

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

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. :D
A+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le 17-06-2009 à 15:32:32    

gcc traduit

Code :
  1. unsigned rot(unsigned x)
  2. {
  3.     #define MASK (~0U << 10)
  4.     #define UMASK (~MASK)
  5.    
  6.     return ((x & MASK) >> 10) | ((x & UMASK) << 22);
  7. }


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.
 


---------------
The truth is rarely pure and never simple (Oscar Wilde)
Reply

Marsh Posté le 17-06-2009 à 15:39:10    

Un Programmeur a écrit :

gcc traduit

Code :
  1. unsigned rot(unsigned x)
  2. {
  3.     #define MASK (~0U << 10)
  4.     #define UMASK (~MASK)
  5.    
  6.     return ((x & MASK) >> 10) | ((x & UMASK) << 22);
  7. }


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.

 



Alors il n'y a plus qu'à essayer sur la cible du P.O.

 


Message édité par Emmanuel Delahaye le 17-06-2009 à 15:42:09

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed