Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1277 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Faire une rotation de 2 octets

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Faire une rotation de 2 octets

n°2064876
vali103
Posté le 20-03-2011 à 14:32:36  profilanswer
 

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
mood
Publicité
Posté le 20-03-2011 à 14:32:36  profilanswer
 

n°2064885
regexp42
Eplucheur de RFC.
Posté le 20-03-2011 à 14:55:45  profilanswer
 

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

n°2064890
vali103
Posté le 20-03-2011 à 16:09:08  profilanswer
 

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
 :??:

n°2064892
SquiZZ
Posté le 20-03-2011 à 16:16:26  profilanswer
 

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

n°2064902
regexp42
Eplucheur de RFC.
Posté le 20-03-2011 à 17:19:50  profilanswer
 

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.

n°2064919
vali103
Posté le 20-03-2011 à 19:46:52  profilanswer
 

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 ;)

n°2065097
leonhard
Posté le 21-03-2011 à 14:45:18  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Faire une rotation de 2 octets

 

Sujets relatifs
[Divers] Inverser octets tous les 2 nRéception d'octets
écrire plus que 32767 octets dans un fichier!![Excel] Inverser l'ordre des mots dans une cellule
Libraire GD : inverser l'ordre dans un histogrammeInverser une liste
Lecture octets d'une disquetteUpload PHP ok mais fichier déplacé = 0 octets
Plus de sujets relatifs à : Faire une rotation de 2 octets


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR