Permutation de deux variable
Répondre à la discussion
Affichage des résultats 1 à 21 sur 21

Permutation de deux variable



  1. #1
    invite414aeef9

    Question Permutation de deux variable


    ------

    Bonjour,
    Ma question est :
    Est-ce qu' on peut permuter la valeur de deux variables sans utiliser une troisieme.

    -----

  2. #2
    invite2d7144a7

    Re : Permutation de deux variable

    Bonjour,

    Oui, avec une série de XOR :
    (En C, l'opérateur ^= est XOR)

    Code:
            a^=b;
            b^=a;
            a^=b;

  3. #3
    Jack
    Modérateur

    Re : Permutation de deux variable

    A la condition qu'elles soient entières ou d'un type dérivé.

  4. #4
    invite2d7144a7

    Re : Permutation de deux variable

    Bonjour,
    Citation Envoyé par Jack Voir le message
    A la condition qu'elles soient entières ou d'un type dérivé.
    Non, il suffit d'adapter, la seule condition impérative est qu'elles aient la même taille.

    MAIS il y quand même une condition nécessaire : elles doivent être différentes, il faut tester avant.

    On peut par exemple appliquer à 2 chaînes de même longueur, en swappant caractère par caractère.

  5. A voir en vidéo sur Futura
  6. #5
    pm42

    Re : Permutation de deux variable

    Citation Envoyé par Jack Voir le message
    A la condition qu'elles soient entières ou d'un type dérivé.
    Dans les langages qui permettent la manipulation directe de la mémoire au niveau de l'octet, genre C via la cast d'une adresse en char*, on doit pouvoir généraliser le Xor ci-dessus à n'importe quel type peut-être ?

  7. #6
    Jack
    Modérateur

    Re : Permutation de deux variable

    Non, il suffit d'adapter, la seule condition impérative est qu'elles aient la même taille.
    En effet, on peut puisque qu'on échange les octets de même rang, peu importe le codage de l'ensemble.

  8. #7
    jiherve

    Re : Permutation de deux variable

    bonsoir
    je ne suis pas sur que cela reponde à la question!
    amha ce qu'il cherche c'est a <=> b
    donc la suite :

    c:= a;
    a:= b;
    b:= c;
    implicitement ou explicitement il faut une variable tampon
    a^= b; => a xor b
    b^= a; => b xor ( a xor b) = b
    a^= b; => a xor b ????
    les instructions sont séquentielles du moins c’était le cas de mon temps
    JR
    l'électronique c'est pas du vaudou!

  9. #8
    pm42

    Re : Permutation de deux variable

    Citation Envoyé par jiherve Voir le message
    implicitement ou explicitement il faut une variable tampon
    Non justement.

    Citation Envoyé par jiherve Voir le message
    a^= b; => a xor b
    b^= a; => b xor ( a xor b) = b
    a^= b; => a xor b ????
    les instructions sont séquentielles du moins c’était le cas de mon temps
    Tu as essayé ? Parce que ça marche. Notamment parce que b xor (a xor b) = a et non pas = b comme tu l'as écrit.

  10. #9
    jiherve

    Re : Permutation de deux variable

    Re
    oui erreur, il m'arrive de raisonner de travers.
    désolé
    JR
    Dernière modification par jiherve ; 22/12/2016 à 22h21.
    l'électronique c'est pas du vaudou!

  11. #10
    pm42

    Re : Permutation de deux variable

    Citation Envoyé par jiherve Voir le message
    Re
    oui erreur, il m'arrive de raisonner de travers.
    désolé
    Rien de grave, ça arrive à tout le monde (et à moi souvent).

  12. #11
    polo974

    Re : Permutation de deux variable

    Citation Envoyé par whoami Voir le message
    Bonjour,
    ...
    MAIS il y quand même une condition nécessaire : elles doivent être différentes, il faut tester avant.
    ...
    Ah bon, et pourquoi donc ne pourrait-on pas les xorer si elles ont la même valeur ? ? ?

    (au fait, c'est un sujet d'exo ou bien je me trompe ?)
    Jusqu'ici tout va bien...

  13. #12
    CM63

    Re : Permutation de deux variable

    En fait quand on fait:

    Code:
    a^=b
    On passe implicitement par une "case" intermédiaire, qui est certes dans le registre du processeur, et non pas en mémoire, mais bon, la nuance est subtile.
    Sans compter que cette "économie de variable" coûte cher: puisqu'il faut exécuter 3 instructions.
    Dernière modification par CM63 ; 23/12/2016 à 12h36.

  14. #13
    pm42

    Re : Permutation de deux variable

    Tu ne sais pas si le compilateur n'a pas mis ces variables dans des registres ce qu'il fait des que possible. Ni le coût d'un accès mémoire comparé à un xor.
    Mais effectivement une variable intermédiaire utilisée localement doit permettre une meilleure optimisation.

  15. #14
    invite2800a7c8

    Re : Permutation de deux variable

    Citation Envoyé par abdolah.-bd1 Voir le message
    Bonjour,
    Ma question est :
    Est-ce qu' on peut permuter la valeur de deux variables sans utiliser une troisieme.
    Salut,
    ben oui avec une pile lifo par exemple.
    mais ce sera un peu tricher puisque l'on va se servir des registres internes du processeur.
    En haut niveau on aura l'impression de n'utiliser que deux variables, mais au niveau du processeur ce ne sera pas le cas.

    Une petite routine en langage machine x.86

    Code:
    0 [EBP] EAX MOV                
    EBX 0 [EBP] MOV                
    EAX EBX MOV                   
    RET


    Cordialement
    Ludwig

  16. #15
    Jack
    Modérateur

    Re : Permutation de deux variable

    Sans compter que cette "économie de variable" coûte cher: puisqu'il faut exécuter 3 instructions.
    C'est pas faux:
    Code:
    	int x = 5, y = 3;
    0032139E  mov         dword ptr [x],5  
    003213A5  mov         dword ptr [y],3  
            x ^= y;
    00DD13AC  mov         eax,dword ptr [x]  
    00DD13AF  xor         eax,dword ptr [y]  
    00DD13B2  mov         dword ptr [x],eax  
    	y ^= x;
    00DD13B5  mov         eax,dword ptr [y]  
    00DD13B8  xor         eax,dword ptr [x]  
    00DD13BB  mov         dword ptr [y],eax  
    	x ^= y;
    00DD13BE  mov         eax,dword ptr [x]  
    00DD13C1  xor         eax,dword ptr [y]  
    00DD13C4  mov         dword ptr [x],eax
    Dernière modification par Jack ; 23/12/2016 à 13h34.

  17. #16
    invite9dc7b526

    Re : Permutation de deux variable

    sinon, pour des variables numériques, il y a l'astuce (qui a des variantes)

    a = b - a
    b = b - a
    a = a + b

  18. #17
    invite9dc7b526

    Re : Permutation de deux variable

    on peut aussi écrire par exemple

    a = ab
    b = a/b
    a = a/b

    en fait on a besoin d'une fonction de 2 variables f telle qu'il existe des fonctions g et h et que si f(x,y)=z alors x=g(y,z) et y=h(x,z). Et il suffit de prendre une fonction symétrique en x,y telle que sa dérivée par rapport à x existe et soit non nulle (comme f(x,y)=x+y ou f(x,y)=xy).

  19. #18
    invite2d7144a7

    Re : Permutation de deux variable

    Bonjour,

    Oui, mais ATTENTION : si les variables en question sont des réels (float ou double), il y aura des approximations lors des calculs, et tu ne retrouveras pas les bonnes valeurs, sauf par chance.

  20. #19
    polo974

    Re : Permutation de deux variable

    Citation Envoyé par minushabens Voir le message
    on peut aussi écrire par exemple

    a = ab
    b = a/b
    a = a/b
    ....
    non, car ab risque fort de déborder...

    sinon, on peut aussi passer par une série de shift en passant par la retenue (mémoire 1 bit)...
    Jusqu'ici tout va bien...

  21. #20
    danyvio

    Re : Permutation de deux variable

    Citation Envoyé par minushabens Voir le message
    sinon, pour des variables numériques, il y a l'astuce (qui a des variantes)

    a = b - a
    b = b - a
    a = a + b
    C'est ce que j'ai utilisé de temps en temps. La seule contrainte est que la somme des valeurs absolues des variables initiales ne provoque pas d'overflow.
    On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !

  22. #21
    CM63

    Re : Permutation de deux variable

    Bonjour,

    Lorsque, dans certains langages comme Python ou Ruby, on fait:

    a,b = b,a

    Évidement, c'est de la triche, car une fois interprétée cette instruction passe bien par une variable temporaire.

Discussions similaires

  1. fonction a deux variable
    Par invite85fb66a4 dans le forum Mathématiques du supérieur
    Réponses: 6
    Dernier message: 24/05/2016, 22h05
  2. permutation de deux variables
    Par invite57b37f86 dans le forum Programmation et langages, Algorithmique
    Réponses: 18
    Dernier message: 13/01/2013, 22h41
  3. permutation de deux variables (PIC 16F84A)
    Par invitefa15af9f dans le forum Électronique
    Réponses: 19
    Dernier message: 25/11/2011, 17h13
  4. fonction à deux variable
    Par invite4fc47b21 dans le forum Mathématiques du supérieur
    Réponses: 3
    Dernier message: 24/05/2011, 16h49
  5. Equation a deux variable
    Par invite7e472cbe dans le forum Mathématiques du supérieur
    Réponses: 5
    Dernier message: 23/08/2010, 13h15