Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 05-10-2017 19:59:40

Arakis
Membre
Distrib. : Jessie - Debian 8
Noyau : Linux 3.16.0-4-686-pae
(G)UI : KDE
Inscription : 16-09-2017

Intervertir 2 variables entières sans utiliser une 3ème variable.

Exemple : a = 4 et b = 6

xor -> fonction binaire "ou exclusif".

- a = a xor b = 4 xor 6 => a = 2

- b = a xor b = 2 xor 6 => b = 4

- a = a xor b = 2 xor 4 => a = 6

CQFD : a et b ont bien été intervertis.

Hors ligne

#2 05-10-2017 20:08:23

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.11.12
(G)UI : openbox
Inscription : 26-08-2010

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

En python (python3.x pour le format) on fait :


a = 4
b = 6
a, b = b, a
print("a = {}, b = {}".format(a, b))
 


Et ça marche aussi pour des variables non entières, et qui ne sont même pas des nombres !
Je sais, c'est un peu triché big_smile

EDIT: On retrouve à peu près la même syntaxe dans d'autre langage (comme en ruby par exemple…).

Dernière modification par enicar (05-10-2017 20:09:56)


La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#3 05-10-2017 20:13:33

Arakis
Membre
Distrib. : Jessie - Debian 8
Noyau : Linux 3.16.0-4-686-pae
(G)UI : KDE
Inscription : 16-09-2017

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

Merci pour ton exemple.

Je me demandais s'il n'était pas possible de le faire avec les pointeurs des variables pour amener l'opération sur tout type de variable.
Mais la 1ère opération est délicate car on tombe sur un pointeur quelconque. Et ça c'est pas bon du tout.

On ne joue pas impunément avec les pointeurs. Rigueur ... Rigueur.

Remarque en y réfléchissant, la 1ère opération ne fait que changer l'adresse pointant sur une valeur.
Et dans ce cas de figure (xor sur des pointeurs) on s'en fout royalement puisque ce qui nous importe c'est justement les pointeurs.
L'important c'est de retomber sur ses pattes ...

Finalement, c'est quelque chose à tenter !!!

Dernière modification par Arakis (05-10-2017 20:25:00)

Hors ligne

#4 05-10-2017 20:22:17

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.11.12
(G)UI : openbox
Inscription : 26-08-2010

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

Tu n'as pas précisé le langage que tu utilises, je suppose que c'est du C, vu que tu parles
de pointeurs.

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#5 05-10-2017 20:25:32

Arakis
Membre
Distrib. : Jessie - Debian 8
Noyau : Linux 3.16.0-4-686-pae
(G)UI : KDE
Inscription : 16-09-2017

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

Ou d'assembleur - > langage machine

De toute façon mon exemple s'applique à n'importe quel langage.
Je l'ai déjà fait en assembleur, sous Delphi (Lazarus), C, PHP, etc ...
Je parle bien sûr du 1er exemple.

Dernière modification par Arakis (05-10-2017 20:30:01)

Hors ligne

#6 05-10-2017 21:12:44

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.11.12
(G)UI : openbox
Inscription : 26-08-2010

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

Je sais bien que le système du xor fonctionne, c'est un truc qu'on apprend quand on débute
en programmation wink

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#7 05-10-2017 21:24:06

enicar
Membre
Lieu : Grenoble
Distrib. : debian/sid
Noyau : Linux 4.11.12
(G)UI : openbox
Inscription : 26-08-2010

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

Pour le comprendre il suffit de regarder ce que ça donne pour des variables sur un seul bit.
Comme l'opération xor est commutative il n 'y a que trois cas :

cas| a b xor
1   | 0 0  0
2   | 1 0  1
3   | 1 1  0

Cas n° 1, a et b valent 0 :
a = 0 xor 0 = 0
b = 0 xor 0 = 0
a = 0 xor 0 = 0
Donc a et b valent toujours zéro.

Cas n°2, a=1 et b=0
a = 1 xor 0 = 1
b = 1 xor 0 = 1
a = 1 xor 1 = 0
à présent a = 0 et b = 1

cas n°3 a=1 et b=1
a = 1 xor 1 = 0
b = 0 xor 1 = 1
a = 0 xor 1 = 1
a et b valent tous les deux 1. Ce qui achève la démonstration.

La machine, c'est dépassé ! On va tout remplacer par des humains big_smile

Hors ligne

#8 06-10-2017 12:54:54

Arakis
Membre
Distrib. : Jessie - Debian 8
Noyau : Linux 3.16.0-4-686-pae
(G)UI : KDE
Inscription : 16-09-2017

Re : Intervertir 2 variables entières sans utiliser une 3ème variable.

Arakis a écrit :

Merci pour ton exemple.

Je me demandais s'il n'était pas possible de le faire avec les pointeurs des variables pour amener l'opération sur tout type de variable.
Mais la 1ère opération est délicate car on tombe sur un pointeur quelconque. Et ça c'est pas bon du tout.

On ne joue pas impunément avec les pointeurs. Rigueur ... Rigueur.

Remarque en y réfléchissant, la 1ère opération ne fait que changer l'adresse pointant sur une valeur.
Et dans ce cas de figure (xor sur des pointeurs) on s'en fout royalement puisque ce qui nous importe c'est justement les pointeurs.
L'important c'est de retomber sur ses pattes ...

Finalement, c'est quelque chose à tenter !!!

Dernière modification par Arakis (06-10-2017 12:59:29)

Hors ligne

Pied de page des forums