Bonjour,
Ma question est :
Est-ce qu' on peut permuter la valeur de deux variables sans utiliser une troisieme.
-----
Bonjour,
Ma question est :
Est-ce qu' on peut permuter la valeur de deux variables sans utiliser une troisieme.
Bonjour,
Oui, avec une série de XOR :
(En C, l'opérateur ^= est XOR)
Code:a^=b; b^=a; a^=b;
A la condition qu'elles soient entières ou d'un type dérivé.
Bonjour,
Non, il suffit d'adapter, la seule condition impérative est qu'elles aient la même taille.
MAIS il y quand même une condition nécessaire : elles doivent être différentes, il faut tester avant.
On peut par exemple appliquer à 2 chaînes de même longueur, en swappant caractère par caractère.
En effet, on peut puisque qu'on échange les octets de même rang, peu importe le codage de l'ensemble.Non, il suffit d'adapter, la seule condition impérative est qu'elles aient la même taille.
bonsoir
je ne suis pas sur que cela reponde à la question!
amha ce qu'il cherche c'est a <=> b
donc la suite :
c:= a;
a:= b;
b:= c;
implicitement ou explicitement il faut une variable tampon
a^= b; => a xor b
b^= a; => b xor ( a xor b) = b
a^= b; => a xor b ????
les instructions sont séquentielles du moins c’était le cas de mon temps
JR
l'électronique c'est pas du vaudou!
Non justement.
Tu as essayé ? Parce que ça marche. Notamment parce que b xor (a xor b) = a et non pas = b comme tu l'as écrit.
Re
oui erreur, il m'arrive de raisonner de travers.
désolé
JR
Dernière modification par jiherve ; 22/12/2016 à 22h21.
l'électronique c'est pas du vaudou!
Jusqu'ici tout va bien...
En fait quand on fait:
On passe implicitement par une "case" intermédiaire, qui est certes dans le registre du processeur, et non pas en mémoire, mais bon, la nuance est subtile.Code:a^=b
Sans compter que cette "économie de variable" coûte cher: puisqu'il faut exécuter 3 instructions.
Dernière modification par CM63 ; 23/12/2016 à 12h36.
Tu ne sais pas si le compilateur n'a pas mis ces variables dans des registres ce qu'il fait des que possible. Ni le coût d'un accès mémoire comparé à un xor.
Mais effectivement une variable intermédiaire utilisée localement doit permettre une meilleure optimisation.
Salut,
ben oui avec une pile lifo par exemple.
mais ce sera un peu tricher puisque l'on va se servir des registres internes du processeur.
En haut niveau on aura l'impression de n'utiliser que deux variables, mais au niveau du processeur ce ne sera pas le cas.
Une petite routine en langage machine x.86
Code:0 [EBP] EAX MOV EBX 0 [EBP] MOV EAX EBX MOV RET
Cordialement
Ludwig
C'est pas faux:Sans compter que cette "économie de variable" coûte cher: puisqu'il faut exécuter 3 instructions.
Code:int x = 5, y = 3; 0032139E mov dword ptr [x],5 003213A5 mov dword ptr [y],3 x ^= y; 00DD13AC mov eax,dword ptr [x] 00DD13AF xor eax,dword ptr [y] 00DD13B2 mov dword ptr [x],eax y ^= x; 00DD13B5 mov eax,dword ptr [y] 00DD13B8 xor eax,dword ptr [x] 00DD13BB mov dword ptr [y],eax x ^= y; 00DD13BE mov eax,dword ptr [x] 00DD13C1 xor eax,dword ptr [y] 00DD13C4 mov dword ptr [x],eax
Dernière modification par Jack ; 23/12/2016 à 13h34.
sinon, pour des variables numériques, il y a l'astuce (qui a des variantes)
a = b - a
b = b - a
a = a + b
on peut aussi écrire par exemple
a = ab
b = a/b
a = a/b
en fait on a besoin d'une fonction de 2 variables f telle qu'il existe des fonctions g et h et que si f(x,y)=z alors x=g(y,z) et y=h(x,z). Et il suffit de prendre une fonction symétrique en x,y telle que sa dérivée par rapport à x existe et soit non nulle (comme f(x,y)=x+y ou f(x,y)=xy).
Bonjour,
Oui, mais ATTENTION : si les variables en question sont des réels (float ou double), il y aura des approximations lors des calculs, et tu ne retrouveras pas les bonnes valeurs, sauf par chance.
On trouve des chercheurs qui cherchent ; on cherche des chercheurs qui trouvent !
Bonjour,
Lorsque, dans certains langages comme Python ou Ruby, on fait:
a,b = b,a
Évidement, c'est de la triche, car une fois interprétée cette instruction passe bien par une variable temporaire.