Faire une rotation de 2 octets - C - Programmation
Marsh Posté le 20-03-2011 à 14:55:45
Tu peux utiliser le tilde ~ pour inverser tous les bits d'un int.
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
Marsh Posté le 20-03-2011 à 16:16:26
Avec l'opérateur et &, tu peux sélectionner une partie de ta valeur :
Code :
|
Avec les opérateurs de décalage, tu peux déplacer les parties :
Code :
|
Avec l'opérateur ou |, tu peux recoller les morceaux :
Code :
|
Marsh Posté le 20-03-2011 à 17:19:50
vali103 a écrit : Merci pour la réponse |
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.
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
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 : @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 !
Marsh Posté le 20-03-2011 à 14:32:36
Salut !
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
Message édité par vali103 le 20-03-2011 à 19:47:45