Pagina 1 di 1

Swap di due variabili

MessaggioInviato: 22 mag 2018, 18:38
da venexian
Lo swap tra due registri è una delle procedure che si imparano da subito in qualsiasi corso di programmazione.

swap(a,b):
t = a
a = b
b = t

E se non avessi disponibile t?
E' possibile farlo solo con le due variabili a e b? :mrgreen:

Re: Swap di due variabili

MessaggioInviato: 22 mag 2018, 18:53
da fpalone
Con lo XOR?

Ne ho memoria dall'esame di informatica (peraltro era una domanda che mi è capitata all' orale), ma ammetto che sono dovuto andare a rivedere come si fa, perché avevo praticamente rimosso tutti i particolari... :oops:

Re: Swap di due variabili

MessaggioInviato: 22 mag 2018, 18:55
da venexian
fpalone ha scritto:Con lo XOR?

Volendo sì, ma anche no...

Re: Swap di due variabili

MessaggioInviato: 22 mag 2018, 18:57
da GuidoB
a = a + b;
b = a - b;
a = a - b;

Inelegante, poco efficiente, ma funziona. Spero di non doverlo fare mai!
;-)

Re: Swap di due variabili

MessaggioInviato: 22 mag 2018, 19:05
da venexian
=D> a entrambi.

Quello con l'xor proposto da fpalone è più elegante, ma egualmente funzionale:

a = a ^ b
b = a ^ b
a = a ^ b

Perché poco efficiente? Stessa velocità e minor utilizzo di memoria. E' più efficiente, non meno!

Re: Swap di due variabili

MessaggioInviato: 3 ago 2018, 20:13
da EcoTan
Forse elimina anche il rischio di overflow?

(se a e b sono vicini al massimo valore, la prima somma va in overflow)

Re: Swap di due variabili

MessaggioInviato: 3 ago 2018, 21:12
da xyz
In C++ dallo standard C++98 nell'include "algorithm>" o nello standard C++11 nell'include "utility" esiste la funzione template "std::swap(a, b)":

http://www.cplusplus.com/reference/algorithm/swap

Se si esamina il code in assembler generato utilizza due registri per caricare i dati per poi scriverli scambiando gli indirizzi di memoria.

Codice C++::

Codice: Seleziona tutto
...
int a;
int b;
....
std::swap(a,b);
..


Compilatore C++ GCC architettura x86_64 codice assembler di "std::wap":

Codice: Seleziona tutto
movl   12(%rsp), %esi
movl   8(%rsp), %eax
movl   %esi, 8(%rsp)
movl   %eax, 12(%rsp)

Re: Swap di due variabili

MessaggioInviato: 3 ago 2018, 21:36
da EdmondDantes
Si può fare anche con * e /, in modo simile al messaggio 4