Cos'è ElectroYou | Login Iscriviti

ElectroYou - la comunità dei professionisti del mondo elettrico

Swap di due variabili

Problemi curiosi e quiz vari.

Moderatore: Foto Utentecarlomariamanenti

0
voti

[1] Swap di due variabili

Messaggioda Foto Utentevenexian » 22 mag 2018, 18:38

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:
Immagine
Avatar utente
Foto Utentevenexian
5.189 1 4 7
Master
Master
 
Messaggi: 1716
Iscritto il: 13 mag 2017, 10:07
Località: Venezia (ma va?)

0
voti

[2] Re: Swap di due variabili

Messaggioda Foto Utentefpalone » 22 mag 2018, 18:53

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:
Avatar utente
Foto Utentefpalone
9.860 4 7 10
G.Master EY
G.Master EY
 
Messaggi: 1995
Iscritto il: 26 dic 2007, 17:46
Località: roma

0
voti

[3] Re: Swap di due variabili

Messaggioda Foto Utentevenexian » 22 mag 2018, 18:55

fpalone ha scritto:Con lo XOR?

Volendo sì, ma anche no...
Immagine
Avatar utente
Foto Utentevenexian
5.189 1 4 7
Master
Master
 
Messaggi: 1716
Iscritto il: 13 mag 2017, 10:07
Località: Venezia (ma va?)

0
voti

[4] Re: Swap di due variabili

Messaggioda Foto UtenteGuidoB » 22 mag 2018, 18:57

a = a + b;
b = a - b;
a = a - b;

Inelegante, poco efficiente, ma funziona. Spero di non doverlo fare mai!
;-)
Big fan of ƎlectroYou!
Avatar utente
Foto UtenteGuidoB
13,7k 6 12 13
G.Master EY
G.Master EY
 
Messaggi: 2072
Iscritto il: 3 mar 2011, 16:48
Località: Madrid

0
voti

[5] Re: Swap di due variabili

Messaggioda Foto Utentevenexian » 22 mag 2018, 19:05

=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!
Immagine
Avatar utente
Foto Utentevenexian
5.189 1 4 7
Master
Master
 
Messaggi: 1716
Iscritto il: 13 mag 2017, 10:07
Località: Venezia (ma va?)

0
voti

[6] Re: Swap di due variabili

Messaggioda Foto UtenteEcoTan » 3 ago 2018, 20:13

Forse elimina anche il rischio di overflow?

(se a e b sono vicini al massimo valore, la prima somma va in overflow)
Avatar utente
Foto UtenteEcoTan
5.057 4 10 13
Expert EY
Expert EY
 
Messaggi: 2759
Iscritto il: 29 gen 2014, 8:54

1
voti

[7] Re: Swap di due variabili

Messaggioda Foto Utentexyz » 3 ago 2018, 21:12

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)
Avatar utente
Foto Utentexyz
5.015 2 4 5
Master EY
Master EY
 
Messaggi: 1303
Iscritto il: 5 dic 2009, 18:37
Località: Italy Turin

0
voti

[8] Re: Swap di due variabili

Messaggioda Foto UtenteEdmondDantes » 3 ago 2018, 21:36

Si può fare anche con * e /, in modo simile al messaggio 4
Il Conte di Montecristo

è tempo perso...
Avatar utente
Foto UtenteEdmondDantes
6.447 6 10 13
G.Master EY
G.Master EY
 
Messaggi: 1834
Iscritto il: 25 lug 2009, 22:18
Località: Marsiglia


Torna a Ah, ci sono!

Chi c’è in linea

Visitano il forum: Nessuno e 1 ospite