[c] Ror

Fermé
Olivier - 2 janv. 2006 à 16:42
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 - 4 janv. 2006 à 00:05
Bonsoir !

Voila voila, je cherche a restranscrire un code en asm en langage C. Mon problème vient de l'instruction ror (rotation de bits sur la droite)

Après une petite recherche j'ai trouvé ça : http://lists.gnupg.org/pipermail/gnupg-devel/2000-September/016633.html

Si j'en crois l'auteur un roL se traduirait de cette façon
rol(x, k) ((x << k) | (x >> (32 - k)))


Sans prétention, j'ai plutot l'impression qu'il s'agirait d'un roR non ?
Dans cette optique, je me lance dans mon programme en C : je cherche a faire un roR de 4 sur la valeur 200 par exemple

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{

int a;
int key = 200;
a = (key << 4) | (key >> 32-4);

    printf("%d\n", a);
   
    system("PAUSE");   
    return 0;
}


Manuellemment j'obtiens 140... avec mon programme 3200, ce qui est bien mais pas top !

Si qqn peut m'éclairer, merci bcp !

4 réponses

Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
3 janv. 2006 à 14:15
Manuellemment j'obtiens 140... avec mon programme 3200, ce qui est bien mais pas top !
Je préfers d'abord un whisky... :D

bin quand tu fais un décalage de bit vers la droite de 1, cela revien a multiplier ton nombre par 2 , donc pour un décalage de 4, ca revient a :
200 * 16 = 3200

Voilà .

Zep3k!GnO
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
3 janv. 2006 à 16:10
Hello,

ça ne serait pas plutôt une division qund on décale à droite??

ce qui rend cohérent le résultat de ton programme puisque tu codes réellement un ROL qui est une multiplication (par 2^4 dans ton cas).

et comme tu fais manuellement un ROR tu obtiens 140.

cordialement
0
Zep3k!GnO Messages postés 2025 Date d'inscription jeudi 22 septembre 2005 Statut Membre Dernière intervention 18 novembre 2015 200
3 janv. 2006 à 16:29
Il est possible en effet que je me soit emmellé les pinceaux... :D
Je ne me me souviens jamais à 100 % dans quel sens c'est ;)
Mais l'idée est la :P , ca fait trop de temp que je n'ai pas eu à m'en servir .

:D

Zep3k!GnO
0
Merci pour vos réponses !
Cependant, je crois que je suis encore à l'ouest ! Pour faire un roR de 4, si j'ai bien compris, il s'agit d'une division par 2^4, c'est à dire 16...
mais 200/16 = 12.5 nan ?

Merci pour votre patience :)
0
JvDo Messages postés 1978 Date d'inscription mercredi 27 juillet 2005 Statut Membre Dernière intervention 28 septembre 2020 858
4 janv. 2006 à 00:05
bonsoir,

le ROR ne fait pas toujours une division puisqu'il réinjecte dans le bit de gauche ce qu'il éjecte par la droite.

ainsi 200 qui s'écrit 11001000 sera transformé successivement en
RoR (1, 200) = 01100100
RoR (2, 200) = 00110010
RoR (3, 200) = 00011001
RoR (4, 200) = 10001100 soit 140 (ou -116)

si tu avais pris 192 ou quelque chose dont les 4 bits de poids faibles sont nuls, tu aurais une division par 16 puisque tu ne ferais sortir à droite (et donc rentrer à gauche) que des 0.

Attention cependant à la longueur de ta zone de travail. Dans ton exemple (celui du premier post), tu étais en 32 bits.
Là, le RoR manuel était sur un octet.

je ne sais pas trop ce que ça donne avec le bit de signe; le 140 est-il un -116?

A+
0