inversion MSB/LSB

inversion MSB/LSB - C - Programmation

Marsh Posté le 28-06-2005 à 09:35:19    

bonjour,
 
vous n'auriez pas une astuce pour inverser (le MSB devient le LSB et ainsi dessuite) un 16bits ?
 
attention, je ne parle pas de champs de bit ou te table de correspondance, car c'est pour de l'embarqué et ces solutions sont "trop" lourdes.
 
Je pensais plutot à une combinaison d'operateurs logiques...
 
Merci

Reply

Marsh Posté le 28-06-2005 à 09:35:19   

Reply

Marsh Posté le 28-06-2005 à 09:46:49    

(x >> 8) | (x << 8)

Reply

Marsh Posté le 28-06-2005 à 10:05:20    

pardon je me suis mal exprimé, c'est un mirroir bit a bit dont j'ai besoin, par un swap d'octet ;)
merci quand meme

Reply

Marsh Posté le 28-06-2005 à 10:06:36    

ca marcherait ca ?
 

Code :
  1. for (i=0;i<12;i++){
  2. result = result + (((nbre >> i) && 1) * (0x800 >> i));
  3. }


 
PS: j'ai besoin de le faire que sur 12 bits en fait...


Message édité par Naamah le 28-06-2005 à 10:07:26
Reply

Marsh Posté le 28-06-2005 à 10:10:49    

(le lsb msb c'est pas du "miroir a bits" hein ?)

Reply

Marsh Posté le 28-06-2005 à 10:14:44    

"less significant bit" et "most SB"

Reply

Marsh Posté le 28-06-2005 à 10:20:04    

ouais je sais, mais alors tu veux vraiment faire une conversion MSB->LSB ou pas ?

Reply

Marsh Posté le 28-06-2005 à 10:25:36    

non je veux transformer 100111100 en 001111001 par exemple, mais sur 12 bits

Reply

Marsh Posté le 28-06-2005 à 10:28:33    

Code :
  1. int res = 0;
  2. for (i=0;i<12;i++) {
  3.   int pouet = ((src & (1<<i))) >> i;
  4.   res |= pouet << (11-i);
  5. }


 
jsuppose ca doit marcher

Reply

Marsh Posté le 28-06-2005 à 10:31:49    

c'est quoi le problème avec les champs de bits en fait ?

Reply

Marsh Posté le 28-06-2005 à 10:31:49   

Reply

Marsh Posté le 28-06-2005 à 10:52:05    

je fait de l'embarqué donc g pas beaucoup de ressource memoire et temps...
il faut faire attention a tout :)

Reply

Marsh Posté le 28-06-2005 à 10:53:00    

merci chrisbk, je vais comparer ton algo et le mien ;)

Reply

Marsh Posté le 28-06-2005 à 10:53:52    

et ? fais le avec des champs de bits, et ensuite compare l'assembleur. Mesure sa taille et sa vitesse d'exécution.

Reply

Marsh Posté le 28-06-2005 à 10:55:03    

le tiens marche pas :o (&& a la place de & ) pis y'a des muls tout laide :o

Reply

Marsh Posté le 28-06-2005 à 10:59:27    

il doit bien y avoir moyen d'adapter un truc comme ca, si tu veux que ca aille vite, non ?
 
http://paul.rutgers.edu/~rhoads/Code/rev.long.c

Reply

Marsh Posté le 28-06-2005 à 11:03:20    

theshockwave a écrit :

il doit bien y avoir moyen d'adapter un truc comme ca, si tu veux que ca aille vite, non ?
 
http://paul.rutgers.edu/~rhoads/Code/rev.long.c


 
 
ca a l'air cool ca ;)

Reply

Marsh Posté le 28-06-2005 à 11:06:30    

Code :
  1. union UInt12
  2. {
  3. unsigned uint12;
  4. struct
  5. {
  6.  unsigned filler : 20;
  7.  unsigned b0 : 1;
  8.  unsigned b1 : 1;
  9.  unsigned b2 : 1;
  10.  unsigned b3 : 1;
  11.  unsigned b4 : 1;
  12.  unsigned b5 : 1;
  13.  unsigned b6 : 1;
  14.  unsigned b7 : 1;
  15.  unsigned b8 : 1;
  16.  unsigned b9 : 1;
  17.  unsigned bA : 1;
  18.  unsigned bB : 1;
  19. } bits;
  20. };
  21. unsigned short mirror_bits(unsigned short x)
  22. {
  23. #define SWAP_BIT(A, B) do { \
  24. unsigned c = (A); \
  25. (A) = (B); \
  26. (B) = c; \
  27. } while(0)
  28. union UInt12 u;
  29. u.uint12 = x;
  30. SWAP_BIT(u.bits.b0, u.bits.bB);
  31. SWAP_BIT(u.bits.b1, u.bits.bA);
  32. SWAP_BIT(u.bits.b2, u.bits.b9);
  33. SWAP_BIT(u.bits.b3, u.bits.b8);
  34. SWAP_BIT(u.bits.b4, u.bits.b7);
  35. SWAP_BIT(u.bits.b5, u.bits.b6);
  36. return u.uint12;
  37. #undef SWAP_BIT
  38. }

donne un résultat pas mal comparé à la version déroulée de la boucle de chrisbk


Message édité par Taz le 28-06-2005 à 11:08:11
Reply

Marsh Posté le 28-06-2005 à 15:32:13    

merci

Reply

Sujets relatifs:

Leave a Replay

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