[DETENTE][ALGO] Permuter 2 variables a et b ...

Permuter 2 variables a et b ... [DETENTE][ALGO] - Programmation

Marsh Posté le 19-11-2001 à 13:59:24    

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 ? ;)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-11-2001 à 13:59:24   

Reply

Marsh Posté le 19-11-2001 à 14:00:35    

tu me dis si je me trompe, mais la bidouille sans 3ième variable ne marche que sur des nombres, non?

Reply

Marsh Posté le 19-11-2001 à 14:12:11    

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

 

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

Reply

Marsh Posté le 19-11-2001 à 14:14:54    

push a
push b
pop a  
pop b
 
autre chose ? :lol: sinon y'a un bidouille à coups de xor je crois ...

Reply

Marsh Posté le 19-11-2001 à 14:16:52    

:sarcastic:  :D

Reply

Marsh Posté le 19-11-2001 à 14:23:01    

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

Reply

Marsh Posté le 19-11-2001 à 14:26:47    

pour un char* non pas du tout :D

 

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

Reply

Marsh Posté le 19-11-2001 à 14:55:25    

TheJackal a écrit a écrit :

pour un char* non pas du tout :D  
 
 




caste le en long pour faire l'operation :D

Reply

Marsh Posté le 19-11-2001 à 15:19:54    

BENB a écrit a écrit :

 
caste le en long pour faire l'operation :D  




 :heink: :ouch:  :D

Reply

Marsh Posté le 19-11-2001 à 16:07:03    

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:


---------------
Ca marche pas sauf des fois ........
Reply

Marsh Posté le 19-11-2001 à 16:07:03   

Reply

Marsh Posté le 19-11-2001 à 16:23:29    

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 !


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-11-2001 à 16:25:45    

:bounce:   :bounce:  
bon, ben g bon   :??:   :??: ms se pose toujours le pbm des strings, non??  :??:   :??:

Reply

Marsh Posté le 19-11-2001 à 16:31:39    

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 ? :)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 19-11-2001 à 16:46:23    

ouaips ca a une tete sympa

Reply

Marsh Posté le 19-11-2001 à 16:52:56    

échange moi les valeurs,
 
a = (2^32)-1;
b = (2^32)-2;
 
avec a et b en unsigned long.

Reply

Marsh Posté le 19-11-2001 à 16:55:19    

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]


---------------
Pipiru piru piru pipiru pi
Reply

Marsh Posté le 19-11-2001 à 17:13:06    

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:)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-11-2001 à 17:16:33    

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

Reply

Marsh Posté le 19-11-2001 à 17:31:55    

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:


---------------
Ca marche pas sauf des fois ........
Reply

Marsh Posté le 19-11-2001 à 17:34:12    

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)


---------------
mes programmes ·· les voitures dans les films ·· apprenez à écrire
Reply

Marsh Posté le 19-11-2001 à 19:02:43    

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]

Reply

Marsh Posté le 19-11-2001 à 20:34:33    

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 !!!


---------------
Le site de l'année :D (XHTML 1.0 strict) : http://darkoli.free.fr/index.html
Reply

Marsh Posté le 19-11-2001 à 21:09:55    

c plus lent que le premier ex, et puis essaye avec des pointeurs comme dropsy voulait faire :D

Reply

Marsh Posté le 20-11-2001 à 10:46:45    

:??: 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

Reply

Marsh Posté le 20-11-2001 à 10:52:37    

je ne vois pas pourquoi la solution xor ne marcherait pas tout le temps et sur tous types de variables (flottants, entiers, pointeurs ...)  
:??:

Reply

Marsh Posté le 20-11-2001 à 10:55:14    

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.....

Reply

Marsh Posté le 20-11-2001 à 11:37:31    

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.


---------------
Pipiru piru piru pipiru pi
Reply

Marsh Posté le 20-11-2001 à 12:56:32    

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+,


---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed