Faire une rotation de 2 octets

Faire une rotation de 2 octets - C - Programmation

Marsh Posté le 20-03-2011 à 14:32:36    

Salut !  :hello:  
 
Voilà j'ai un pointeur qui pointe vers 2 octets = 4*4 bits, par exemple de la forme ab cd.
Dans mon code, je récupère simplement va valeur de ce pointeur avec un printf. Seulement, j'aimerais inverser les bits, et donc récupérer la valeur dc ba.
Par exemple, si le pointeur pointe vers la valeur (f0 00)/16 = (61440)/10, j'aimerais récupérer la valeur (00 0f)/16 = (15)/10.
 
Mais comment faire ?
 
Merci  :jap:


Message édité par vali103 le 20-03-2011 à 19:47:45
Reply

Marsh Posté le 20-03-2011 à 14:32:36   

Reply

Marsh Posté le 20-03-2011 à 14:55:45    

Tu peux utiliser le tilde ~ pour inverser tous les bits d'un int.

Reply

Marsh Posté le 20-03-2011 à 16:09:08    

Merci pour la réponse  ;)  
 
Je viens de compiler avec le tilde.  
Le problème est que maintenant j'obtiens une valeur négative : par exemple (0000)/16 = (0)/10 s'est transformé en (ffff)/16 = (-1)/10
 :??:

Reply

Marsh Posté le 20-03-2011 à 16:16:26    

Avec l'opérateur et &, tu peux sélectionner une partie de ta valeur :

Code :
  1. 0xabcd & 0x0F00 -> 0x0b00


Avec les opérateurs de décalage, tu peux déplacer les parties :

Code :
  1. 0x0b00 >> 4 -> 0x00b0


Avec l'opérateur ou |, tu peux recoller les morceaux :

Code :
  1. 0x0b00 | 0x00c0 -> 0x0bc0

Reply

Marsh Posté le 20-03-2011 à 17:19:50    

vali103 a écrit :

Merci pour la réponse  ;)  
 
Je viens de compiler avec le tilde.  
Le problème est que maintenant j'obtiens une valeur négative : par exemple (0000)/16 = (0)/10 s'est transformé en (ffff)/16 = (-1)/10
 :??:


 
C'est normal avec un int signé vu que tu changes le bit de signe.
Si tu as la possibilité d'utiliser des "unsigned int" ça sera plus pratique pour les bithacks.

Reply

Marsh Posté le 20-03-2011 à 19:46:52    

Je crois que je me suis mal exprimé : je souhaiterais faire une rotation de 2 octets :
ab cd => dc ba et pas une inversion proprement dite de bits.
 
@SquiZZ, merci, je vais regarder ça ;)

Reply

Marsh Posté le 21-03-2011 à 14:45:18    

vali103 a écrit :

Je crois que je me suis mal exprimé : je souhaiterais faire une rotation de 2 octets :
ab cd => dc ba et pas une inversion proprement dite de bits.

 

@SquiZZ, merci, je vais regarder ça ;)

 


Les gens qui parlent pas comme nous appellent un bloc de 4 bits un "nibble".. avec ça tu lances une bête requête "swap nibble" sur ton ami gogol, et tu trouves la réponse..

 

L'idée générale (sans aucune optimisation) c'est de séparer les deux bytes, de permutter les nibble dans les deux bytes et de permuter les bytes ensuite

 

byte a = valeur & 0xff    
byte b = (valeur & 0xff00) >> 8;    
a = ((a << 4) || (a >> 4))    
b = ((b << 4) || (b >> 4))
nouvelle_valeur = (a << 8) | b)

 

Mais on peut faire plus futé et plus efficace !


Message édité par leonhard le 21-03-2011 à 14:46:31
Reply

Sujets relatifs:

Leave a Replay

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