Alex (Ex-Member)
Expert
Messaggi: 441
Iscritto: 15/08/2005
|
voi sapete come fare a scambiare due variabili numeriche senza usare la variabile temporanea?
Codice sorgente - presumibilmente Plain Text |
a:=5;
b:=2;
a:=a+b;
b:=a-b;
a:=a-b;
|
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
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 ;-)
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
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
|
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
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 |
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 |
|
qualcuno (Ex-Member)
Rookie
Messaggi: 37
Iscritto: 30/06/2010
|
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?) |
|
TheKaneB (Member)
Guru^2
Messaggi: 1792
Iscritto: 26/06/2009
|
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
|
|
qualcuno (Ex-Member)
Rookie
Messaggi: 37
Iscritto: 30/06/2010
|
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. |
|
Alex (Ex-Member)
Expert
Messaggi: 441
Iscritto: 15/08/2005
|
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...
|
|
pierotofy (Admin)
Guru^2
Messaggi: 6230
Iscritto: 04/12/2003
|
|
|