Le swap le plus crade de l'histoire du c++

Soyez le premier à donner votre avis sur cette source.

Snippet vu 6 199 fois - Téléchargée 35 fois

Contenu du snippet

Voilà comment échanger les valeurs de deux entiers de la manière la plus sale qui soit. Je n'ai pas testé sur des floats, mais ça m'étonnerai que ça marche. Ce code génère un warning à la compilation sur certains compilateurs.

Source / Exemple :


int a=5;
int b=7;

//De manière classique:
//int c=a;
//a=b;
//b=c;

//et en une seule ligne : 
a^=b^=a^=b; //échange les deux valeurs en faisant des ou-exclusifs

//ce code est équivalent à:
a=a^b;
b=b^a;
a=a^b;

//On a donc a=7 et b=5

A voir également

Ajouter un commentaire Commentaires
Messages postés
14
Date d'inscription
jeudi 6 octobre 2005
Statut
Membre
Dernière intervention
3 juin 2007

T'as raison :-)
5 ans de retard désormais !!!! :-P

Je vais me mettre au Cobol et poster une réponse dans 12 ans. Puis au fortran et poster dans 20 ans ?
Tu seras toujours la ? :-D

Sinon, j'ai eu un cas récent d'utilisation de la méthode XOR sur un PIC ou la mémoire ET les registres sont comptés sur LE doigt de la main.
Economiser un octet ou un registre peu parfois être très confortable. Sur un RISC, c'est aussi rapide qui plus est.

Lol, qui relèvera le défit de répondre once again :-) ?
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
et pourquoi pas l'ecrire en cobol ou en fortran pendant que t'y est ? ;)
(t'as 2 ans et 3 mois de retard :P)
Messages postés
14
Date d'inscription
jeudi 6 octobre 2005
Statut
Membre
Dernière intervention
3 juin 2007

// Héhé, encore les templates si on passe en C++
// ca donne ça et ça marche pour tout !
// J'aime po les macros.

#include <string>
#include
using namespace std;

template <class T>
void SWAP(T &t1,T &t2)
{
T t=t1;
t1=t2;
t2=t;
}

void main()
{
int i=2,j=1;
SWAP(i,j);
cout << i << j << endl;

string s1(" après");
string s2("avant");
SWAP(s1,s2);
cout << s1 << s2 << endl;
}
Messages postés
495
Date d'inscription
dimanche 6 juillet 2003
Statut
Membre
Dernière intervention
9 novembre 2007
1
heu... le code que j'avais utiliser n'est pas si specifique, il emane du rfc de base donc tu pourra le trouver partout, cherche sur google, tu verra que tu ne trouvera pas qu'un seul site ayant le meme code...
Messages postés
92
Date d'inscription
dimanche 2 juin 2002
Statut
Membre
Dernière intervention
24 juin 2004

Comme dis plus haut, ce code est très global (même LOGIN: l'a publié), contrairement au tiens qui vient sans aucun doute possible de ce site. Tu remarqueras d'ailleurs qu'ils n'ont pas surchargé les opérateurs. En ce qui concerne la rapidité, il faudrait comparer les XOR et le XCHNG en asm.
Pour le bug avec 0, je ne sais plus trop où il était.
Afficher les 18 commentaires

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.