Pas de dépendances
#include <stdio.h> void swapint(int* a,int* b) { *a = *a ^ *b; *b = *a ^ *b; *a = *a ^ *b; } void swapint2(int* a,int* b) { *a ^= *b ^= *a ^= *b; } void swapint3(int* a,int* b) { (*a)+=(*b)-=(*a)=(*b)-(*a); } void swapint4(int* a,int* b) { (*a)/=(*b)=((*a)=(*a)*(*b))/(*b); } void swapint5(int* a,int* b) { (*a)=((*b)=((*a)=(*b)^(*a))^(*b))^(*a); } void swapint6(int* a,int* b) { (*b)=(*a)+(*b)-((*a)=(*b)); } int main() { int a,b; a = 135; b = 2834; swapint(&a,&b); printf("a = %d ; b = %d\n",a,b); return 0; }
Si vous lancez le programme, vous constatez qu'effectivement, la fonction swapint a inversé les valeurs des deux int
le printf en témoigne.
Pour l'instant, ne regardez pas swapint2,swapint3, etc....
La fonction swapint va réussir à échanger les variables sans en créer une troisième temporaire.
Car en effet, habituelle, on ferait plutôt :
int c = a;
a = b;
b = c;
Cela crée une variable temporaire c.
Ici, avec des ^ (xor) on échange les valeurs sans variable temporaire.
J'avais fait une petite démonstration que j'avais écrit sur un forum :
Voici la démonstration que j'ai :
Je vire les * pour de la lisibilité :
On a :
a = a^b
b = a^b
a = a^b
Pour de la démonstration, je vais faire intervenir des variables temporaires pour ne pas perdre les valeurs de base.
On obtient :
c = a^b
d = c^b
e = c^d
Si je développe, on a :
c = a^b
d = (a^b)^b
e = (a^b)^((a^b)^b)
la parenthésage est inutile pour les Xor, tout est commutatif
c = a^b
d = a^b^b
e = a^b^a^b^b
Avec le Xor, x^x = 0 et x^0 = x
c = a^b
d = a
e = b
Or d = b, et e = a
A la fin, on a donc a qui est devenu b et b qui est devenu a.
Sur ce même topic :
http://www.siteduzero.com/forum-83-673413-p1-inverser-deux-variables-sans-variable-temporaire.html
magma propose une solution compacte encore plus bluffante :
void swapint2(int *a, int *b)
{
*a ^= *b ^= *a ^= *b;
}
Zérotisme du même site me propose 4 nouvelles solutions intéressantes.
Vous les trouverez dans les fonctions swapint3,swapint4,swapint5,swapint6
