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

 


Dernière réponse
Sujet : [DETENTE][ALGO] Permuter 2 variables a et b ...
gilou C' est connu:
a^=b;
b^=a;
a^=b;
Mais c'est un artifice d'ecriture: a un moment donne, il y a un registre temporaire d'utilise.
A+,

Votre réponse
Nom d'utilisateur    Pour poster, vous devez être inscrit sur ce forum .... si ce n'est pas le cas, cliquez ici !
Le ton de votre message                        
                       
Votre réponse


[b][i][u][strike][spoiler][fixed][cpp][url][email][img][*]   
 
   [quote]
 

Options

 
Vous avez perdu votre mot de passe ?


Vue Rapide de la discussion
gilou C' est connu:
a^=b;
b^=a;
a^=b;
Mais c'est un artifice d'ecriture: a un moment donne, il y a un registre temporaire d'utilise.
A+,
n0mad

BENB a écrit a écrit :

 
c'est le cast qui n'est pas beau... et comme le dis Barbarella
le ponteur qui a recu a+b il pointe n'importe ou...
et il y a le Pb des limites sur les station HP sur lequelles je travaillais il n'y a pas si longtemps les adresse memoire commecaient toutes par 0x8.....  




 
C'est pour ça que ma méthode avec XOR (un peu plus haut dans le thread) est bien plus soft car il n'y a pas de risque de dépassement.

BENB

antp a écrit a écrit :

 
 
pas beau ? on ne fait qu'échanger des pointeurs !!
c'est nettement plus beau que la solution de recopier caractère par caractère (quel est l'intérêt de bouger toute la mémoire quand il suffit de bouger les références)  




c'est le cast qui n'est pas beau... et comme le dis Barbarella
le ponteur qui a recu a+b il pointe n'importe ou...
et il y a le Pb des limites sur les station HP sur lequelles je travaillais il n'y a pas si longtemps les adresse memoire commecaient toutes par 0x8.....

youdontcare je ne vois pas pourquoi la solution xor ne marcherait pas tout le temps et sur tous types de variables (flottants, entiers, pointeurs ...)  
:??:
dropsy :??: ah bon? je voulais faire ca avec des pointeurs?
non, ce que je dis, c que la solution que je donne marche pour ce qui est des nombres (et encore, à condition de pas dépasser les limites de ces nombres)
après, pour des pointeurs... c un autre pbm
TheJackal c plus lent que le premier ex, et puis essaye avec des pointeurs comme dropsy voulait faire :D
darkoli a=2
b=5
 
b=a+b  // a=2, b=7
a=b-a  // a=5, b=7
b=a-b  // a=5, b=2
 
voila je crois que ca marche bien !!!
barbarella tu prends, tu vires,
 
ca marche que sous certaines conditions. Puis alors, le coup des additions et soustractions de pointeur, faut pas déconner.
 
A = adresse X
B = X+1
 
A = A + B donne adresse de A = indéterminé = peut correspondre a une adresse d'un autre process ou thread. Il va apprécier le SE, s'il te jette pas avec un truc du genre ' A effectuer une opératon non conforme' de temps en temps je mange un balai :D
 
Vous vous entrainez pour postuler a un post chez Microsoft ou quoi ? :D

 

[edtdd]--Message édité par Barbarella--[/edtdd]

antp

BENB a écrit a écrit :

 
 
Oui ca marche.... mais c'est pas beau :D  




 
pas beau ? on ne fait qu'échanger des pointeurs !!
c'est nettement plus beau que la solution de recopier caractère par caractère (quel est l'intérêt de bouger toute la mémoire quand il suffit de bouger les références)

camarchepoa

HelloWorld a écrit a écrit :

hum, c'est pas faux.
j'y avais pas pense a ca.
mais, attend voire ...

Code :
  1. char ch1[10];
  2. char ch2[10];
  3. int i;
  4. (...)
  5. for(i=0; i<10; i++)
  6. {
  7.     ch1[i] += ch2[i];
  8.     ch2[i] =  ch1[i] - ch2[i];
  9.     ch1[i] -= ch2[i];
  10. }


 
sattisfait ? :)  




 
oui mais ................. i c bien une variable, non  ;)  
alors ca compte qd même ou pas  :sarcastic:

BENB

antp a écrit a écrit :

 
 
note que ça doit marcher, on ne fait qu'échanger des pointeurs, c'est des entiers
d'ailleurs char* est un entier, puisque pointeur vers une chaîne de caractère... (non ? je sais plus :sweat:)  




 
Oui ca marche.... mais c'est pas beau :D

antp

BENB a écrit a écrit :

 
caste le en long pour faire l'operation :D  




 
note que ça doit marcher, on ne fait qu'échanger des pointeurs, c'est des entiers
d'ailleurs char* est un entier, puisque pointeur vers une chaîne de caractère... (non ? je sais plus :sweat:)

n0mad Problème connu en ASM pour échanger 2 valeurs quelconques :
 
a = a xor b
b = a xor b
a = a xor b
 
difficile de faire plus rapide en terme de cycle : 3 XOR au lieu de 3 MOV et une variable supplémentaire.

 

[edtdd]--Message édité par n0mad--[/edtdd]

barbarella échange moi les valeurs,
 
a = (2^32)-1;
b = (2^32)-2;
 
avec a et b en unsigned long.
dropsy ouaips ca a une tete sympa
HelloWorld hum, c'est pas faux.
j'y avais pas pense a ca.
mais, attend voire ...

Code :
  1. char ch1[10];
  2. char ch2[10];
  3. int i;
  4. (...)
  5. for(i=0; i<10; i++)
  6. {
  7.     ch1[i] += ch2[i];
  8.     ch2[i] =  ch1[i] - ch2[i];
  9.     ch1[i] -= ch2[i];
  10. }


 
sattisfait ? :)

dropsy :bounce:   :bounce:  
bon, ben g bon   :??:   :??: ms se pose toujours le pbm des strings, non??  :??:   :??:
HelloWorld Bien joue dropsy !
Donc je confirme :
 
a = a+b;  
b = a-b;  
a = a-b;
 
youdontcare>
push a  
push b  
pop a  
pop b  
 
t'utilises non pas une variable intermediaire mais carement deux ... ;)
he! la pile, ca prend de la place !
camarchepoa moi je dit avec ce coup la HelloWorld a droit a une promotion  :)  
 
ct quoi le deuxieme mot qu'ils ont dit  ;)  :D  
 
sinon dropsy il etait pas loin :jap:
TheJackal

BENB a écrit a écrit :

 
caste le en long pour faire l'operation :D  




 :heink: :ouch:  :D

BENB

TheJackal a écrit a écrit :

pour un char* non pas du tout :D  
 
 




caste le en long pour faire l'operation :D

TheJackal pour un char* non pas du tout :D

 

[edtdd]--Message édité par TheJackal--[/edtdd]

dropsy

TheJackal a écrit a écrit :

dropsy: non, pkoi que avec des nombres?
 
ca existe pas sans troisieme var  
 
 




 
bon, alors g pas la bonne méthode :(
 
moi je fais:
a=a+b;
b=a-b;
a=a-b;
 
mais c pas jolie pr une string

TheJackal :sarcastic:  :D
youdontcare push a
push b
pop a  
pop b
 
autre chose ? :lol: sinon y'a un bidouille à coups de xor je crois ...
TheJackal dropsy: non, pkoi que avec des nombres?
 
je crois pas que ca existe pas sans troisieme var...

 

[edtdd]--Message édité par TheJackal--[/edtdd]

dropsy tu me dis si je me trompe, mais la bidouille sans 3ième variable ne marche que sur des nombres, non?
HelloWorld bah c'est facile ...
c = a;
a = b;
b = c;
 
oui, mais savez vous que c'est possible sans troisieme varible !
Sans aucune variable intermediaire (et sans bidouille du genre l'instruction XCHG du processeur)
 
Alors, qui a une idee ? ;)

Copyright © 1997-2025 Groupe LDLC (Signaler un contenu illicite / Données personnelles)