Echange de variable rapide.

Un hack de la fonction de swap très joli, très rapide.

^

Voir version :

Pas de dépendances

Télécharger :

#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;
}



Commentaires

	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