[C] Rotation de bits sur la gauche (ROL)
Fermé
anais
-
30 juin 2006 à 21:51
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 3 juil. 2006 à 13:14
kilian Messages postés 8731 Date d'inscription vendredi 19 septembre 2003 Statut Modérateur Dernière intervention 20 août 2016 - 3 juil. 2006 à 13:14
4 réponses
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
1 juil. 2006 à 11:01
1 juil. 2006 à 11:01
Vu ce qui est dit là :
https://www.squalenet.net/fr/ti/tutorial_c/8-operateurs-arithmetiques-et-bits-a-bits.php5
je dirais que c'est simplement :
PS : evite d'utiliser les commande via system() qui vont faire que ton programme va dépendre de l'OS (windows ou linux), alors que getchar() fait pareil et marche avec tout le monde...
Bonne chance
https://www.squalenet.net/fr/ti/tutorial_c/8-operateurs-arithmetiques-et-bits-a-bits.php5
je dirais que c'est simplement :
#include <stdio.h> #include <stdlib.h> int main(){ unsigned int x = 0x65657247; x << 104; printf("hex = %x\n",x); printf("dec = %d\n",x); getchar(); return 0; }
PS : evite d'utiliser les commande via system() qui vont faire que ton programme va dépendre de l'OS (windows ou linux), alors que getchar() fait pareil et marche avec tout le monde...
Bonne chance
Merci pour ta réponse, cependant, je crois que ton code ne fait qu'un décalage de bits vers la gauche (shl en asm), et non une rotation !
mamiemando
Messages postés
33446
Date d'inscription
jeudi 12 mai 2005
Statut
Modérateur
Dernière intervention
20 décembre 2024
7 812
3 juil. 2006 à 00:38
3 juil. 2006 à 00:38
Ok je viens de capter ce que tu faisais. Comme b = 104
1) ((x) >> (b)) entraine un décalage de 104 bits alors que l'entier est codé sur moins de bits (32 je suppose vu ce que tu as écris).
2) ((x) << (32 - (b))) à un décalage de 32-104 <= 0 bits
D'où les messages d'erreurs du compilateur. Il faudrait que tu utilises pour (1) un décalage de moins de 32 bits (en utilisant un opérateur modulo (% en C) ?), et pour deux une valeur absolue (par exemple à l'aide d'une autre macro) ?
Bonne chance
1) ((x) >> (b)) entraine un décalage de 104 bits alors que l'entier est codé sur moins de bits (32 je suppose vu ce que tu as écris).
2) ((x) << (32 - (b))) à un décalage de 32-104 <= 0 bits
D'où les messages d'erreurs du compilateur. Il faudrait que tu utilises pour (1) un décalage de moins de 32 bits (en utilisant un opérateur modulo (% en C) ?), et pour deux une valeur absolue (par exemple à l'aide d'une autre macro) ?
Bonne chance
kilian
Messages postés
8731
Date d'inscription
vendredi 19 septembre 2003
Statut
Modérateur
Dernière intervention
20 août 2016
1 527
3 juil. 2006 à 13:14
3 juil. 2006 à 13:14
Salut,
Ta macro ROL fait en fait un equivalent de ror en assembleur (rotation des bits vers la droite).
Si tu ne mets pas de constante dans b pour ta macro, le compilateur ne te mettra aucune alerte. D'ailleurs avec ta macro (si tu la corriges en un vrai rol), la rotation se fait très bien même avec de gros nombres (par contre on dirait qu'un rol en assembleur ne peut supporter d'opérande de plus de 255 pour la rotation, tandis que ta macro supportera plus.
Si tu as quand même des soucis, tu peux utiliser une fonction qui découpe la rotation en plusieurs rotations distinctes de moins de 32 bits. Un exemple:
Ta macro ROL fait en fait un equivalent de ror en assembleur (rotation des bits vers la droite).
Si tu ne mets pas de constante dans b pour ta macro, le compilateur ne te mettra aucune alerte. D'ailleurs avec ta macro (si tu la corriges en un vrai rol), la rotation se fait très bien même avec de gros nombres (par contre on dirait qu'un rol en assembleur ne peut supporter d'opérande de plus de 255 pour la rotation, tandis que ta macro supportera plus.
Si tu as quand même des soucis, tu peux utiliser une fonction qui découpe la rotation en plusieurs rotations distinctes de moins de 32 bits. Un exemple:
#include <stdio.h> // Ta rotation ror corrigée en rol #define ROL32(x,b) (((x) << (b)) | ((x) >> (32 - (b)))) //La rotation en assembleur unsigned int test_asm() { __asm__("movl $100, %eax\n\t" "roll $255, %eax" ); } // La rotation découpée en plusieurs rotations distinctes unsigned int rol(unsigned int nb, unsigned int r) { for (; r>31; r-=31) { nb = ROL32(nb, 31); } nb = ROL32(nb, r); return nb; } int main(int argc, char **argv) { unsigned int a=100; unsigned int r=255; //Affichage de la rotation en assembleur printf("%u\n", test_asm() ); //Affichage de la rotation en C //Marche aussi, chez moi, avec printf("%u\n", ROL32(a,r) ); printf("%u\n", rol(a,r) ); return 0; }