Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - scambio di due variabili senza la variabile temporanea
Forum - Algoritmi - scambio di due variabili senza la variabile temporanea

Pagine: [ 1 2 3 ] Precedente | Prossimo
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 21:50
Venerdì, 02/07/2010
voi sapete come fare a scambiare due variabili numeriche senza usare la variabile temporanea?
Codice sorgente - presumibilmente Plain Text

  1. a:=5;
  2. b:=2;
  3.  
  4. a:=a+b;
  5. b:=a-b;
  6. a:=a-b;


;);)

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 22:53
Venerdì, 02/07/2010
Questo metodo funziona, a patto di non avere comportamenti strani della CPU in caso di overflow.

Un metodo universale, che non genera nessun tipo di errore di overflow ed è quindi implementabile dappertutto, è il seguente:

a = a XOR b
b = a XOR b
a = a XOR b

provare per credere ;-)

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 23:09
Venerdì, 02/07/2010
Adoro la soluzione di TheKaneB. Non l'avevo mai vista, ma appena l'ho letta ho preso un pezzo di carta e l'ho verificata, che figata :love:


Il mio blog: https://piero.dev
PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 23:11
Venerdì, 02/07/2010
Testo quotato

Postato originariamente da pierotofy:

Adoro la soluzione di TheKaneB. Non l'avevo mai vista, ma appena l'ho letta ho preso un pezzo di carta e l'ho verificata, che figata :love:



ti dirò di più... il mio metodo funziona anche con i numeri in floating point, mentre il precedente soffre di problemi di approssimazione, deteriorando quindi la precisione dei due numeri

PM Quote
Avatar
qualcuno (Ex-Member)
Rookie


Messaggi: 37
Iscritto: 30/06/2010

Segnala al moderatore
Postato alle 23:51
Venerdì, 02/07/2010
Testo quotato

Postato originariamente da TheKaneB:

Questo metodo funziona, a patto di non avere comportamenti strani della CPU in caso di overflow.

Un metodo universale, che non genera nessun tipo di errore di overflow ed è quindi implementabile dappertutto, è il seguente:

a = a XOR b
b = a XOR b
a = a XOR b

provare per credere ;-)


Conoscevo anche io questa soluzione :)
Ma per i numeri in floating point, in linguaggi tipo C/C++, mi sembra di ricordare che l'operatore XOR tra float non sia definito, ergo si usa l'inline assembly? (visto che per fare lo xor devo prima caricare i valori nei registri a quel punto ne faccio a meno di fare lo XOR?)

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 10:28
Sabato, 03/07/2010
molto banalmente, ti basta fare un cast ad un tipo per cui sia definito lo xor bitwise (int per i float, e long long int per i double). Il cast tra tipi di uguali dimensioni non comporta l'introduzione di istruzioni supplementari, ed eviti di ricorrere ad istruzioni assembly che non sono portabili :-p

PM Quote
Avatar
qualcuno (Ex-Member)
Rookie


Messaggi: 37
Iscritto: 30/06/2010

Segnala al moderatore
Postato alle 10:38
Sabato, 03/07/2010
Testo quotato

Postato originariamente da TheKaneB:

molto banalmente, ti basta fare un cast ad un tipo per cui sia definito lo xor bitwise (int per i float, e long long int per i double). Il cast tra tipi di uguali dimensioni non comporta l'introduzione di istruzioni supplementari, ed eviti di ricorrere ad istruzioni assembly che non sono portabili :-p


Ok, capito. :)

PM Quote
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Segnala al moderatore
Postato alle 14:06
Sabato, 03/07/2010
ma perchè dovrebbe aver problemi?


a:=5;
b:=2;

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

insomma..alla fine e dimostrato matematicamente....basta semplificare...

PM Quote
Avatar
pierotofy (Admin)
Guru^2


Messaggi: 6230
Iscritto: 04/12/2003

Segnala al moderatore
Postato alle 15:03
Sabato, 03/07/2010
Se le due variabili ad esempio sono interi unsigned da 32 bit (2^32-1) e nelle due variabili hai 429496720 e 429496721, sommandoli andrai in arithmetic overflow. http://it.wikipedia.org/wiki/Arithmetic_overflow


Il mio blog: https://piero.dev
PM Quote
Pagine: [ 1 2 3 ] Precedente | Prossimo