Je voudrais alterner les valeurs de 2 variables entières sans utiliser une autre variable auxiliaire.Comment faire ?
Je voudrais alterner les valeurs de 2 variables entières sans utiliser une autre variable auxiliaire.Comment faire ?
Bonjour,
Ce n'est pas difficile, mais avant :
es-tu vraiment à cours de mémoire pour avoir besoin de faire ça ?![]()
Tu veux dire échanger ? Car dans alterner, il y a une notion de répétition et le il te faudra un timer.
Site : http://chgi.developpez.com
Pourquoi faire simple quand on peut faire compliqué ? (Jacques Rouxel)
Bonjour
Mais déjà ça a autant d'affectations que de passer par une 3° variable intermédiaire de tampon et ça a 3 opérations en plus ; et si tu as au départ a == b ça ne marche plus.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 int a=123; int b=456; a=a^b; b=a^b; a=a^b; printf("a=%d, b=%d\n", a, b) // a=456, b=123
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Je connaissais la version avec ^, ici ils généralisent.
Il y a certainement des intrinsics pour le faire. Ce serait le plus efficace.
Utiliser une lib standard serait mieux. std::swap est disponible en C++, il ne semble rien y avoir en C.
La question initiale reste au mieux vague de toute façon.
Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
Un peu de programmation réseau ?
Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Inutile certes... mais pas valable. L'associativité et la commutativité n'ont rien à voir. Déjà l'associativité ne s'applique que s'il y a plus de 2 opérandes (l'associativité de l'addition c'est dire que a+b+c aura le même résultat quelle que soit l'addition intermédiaire qui sera faite pour additionner le montant intermédiaire au 3° nombre restant).
Et la commutativité (qui dit que permuter les opérandes ne change pas le résultat) est tout aussi inutile dans le cas où a == b. Car si a == b, dès la première opération a=a^b on obtient a=0. Ayant perdu a, on ne peut alors plus le retrouver dans b au final.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Si a et b ont la même valeur, ça ne pose pas de problème particulier.
Pour la multiplication, ça ne marchera pas s'il y dépassement de capacité ou si a ou b est nul.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12 unsigned int a = 2, b= 2; a = a ^ b; // a=0 b = a ^ b; // b=2 a = a ^ b; // a=2, a et b ont bien été échangées a = a + b; // a=4 b = a - b; // b=2 a = a - b; // a=2, a et b ont bien été échangées a = a * b; // a=4 b = a / b; // b=2 a = a / b; // a=2, a et b ont bien été échangées
Pour l'addition, aucun problème pour les unsigned, mais problème pour les signed car le dépassement est un U.B.
Mais si a et b sont la même variable, ça ne marche pas
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 unsigned int *pa = &a, *pb= &a; *pa = *pa ^ *pb; // *pa=0, mais aussi *pb = 0 !! *pb = *pa ^ *pb; // *pb=0 *pa=0 *pa = *pa ^ *pb; // *pa=0 *pb=0, a et b ont bien été perdus! *pa = *pa + *pb; // *pa=4, mais aussi *pb = 4! *pb = *pa - *pb; // *pb=0 *pa=0 *pa = *pa - *pb; // *pa=2 *pb=0, a et b ont bien été perdus!
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Bonjour Sve,
Tu te trompes. Démonstration de principe, si tu avais raison ce serait également vrai bit par bit (c'est une opération binaire qui n'altère que les bits de même rang) donc cela ne fonctionnerait pas pour tous les bits identiques (de même rang bien sûr) donc pour toutes les valeurs qui auraient la malchance de partager ne serait-ce qu'un bit et pas seulement pour celles qui sont identiques c'est à dire dont tous les bits sont les mêmes. Cela ne laisserait pas beaucoup de cas où le mécanisme fonctionnerait : seulement si b = ~a.
Outre cette démonstration partielle par l'absurde, l'application de l'associativité et commutativté de l'opérateur ^ donne :
Aucune hypothèse sur les valeurs de a et b. Je pense que ce qui peut gêner est l'apparition de 0, mais pour le ^ ce n'est pas un élément absorbant (comme pour le &) mais un élément neutre.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 a = a_o ; // a_o valeur d'origine, seulement utile pour suivre la séquence b = b_o ; // b_o valeur d'origine a = a ^ b; // a = a_o ^ b_o b = a ^ b; // b = (a_o ^ b_o) ^ b_o = a_o ^ b_o ^ b_o = a_o ^ (b_o ^b_o) = a_o ^ 0 = a_o (associativité) a = a ^ b; // a = (a_o ^ b_o) ^ a_o = a_o ^ b_o ^ a_o = a_o ^a_o ^ b_o == (a_o ^a_o) ^ b_o = 0 ^ b_o = b_o (commutativité puis associativité)
Appliquons ce qui précède si a == b :
Salut
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 a = u ; // u valeur d'origine, utile pour suivre la séquence b = u ; // u valeur d'origine a = a ^ b; // a = u ^ u = 0 b = a ^ b; // b = 0 ^ u = u a = a ^ b; // a = 0 ^ u = u, inutile mais exact
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Raccourci dans l'écriture. Bien évidemment que "étoile truc" représente la valeur située à l'adresse stockée dans le pointeur "truc". Je pensais que mon expérience passée sur la partie "C" de ce forum suffirait pour que tu admettes que c'est de cela dont je parle sans venir me forcer à le spécifier explicitement.
Oui ça commence à me caresser l'esprit.
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Mon Tutoriel sur la programmation «Python»
Mon Tutoriel sur la programmation «Shell»
Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
Et on poste ses codes entre balises [code] et [/code]
Partager