Oppure

Loading
02/07/10 19:50
Alex
voi sapete come fare a scambiare due variabili numeriche senza usare la variabile temporanea?
a:=5;
b:=2;

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

;);)
aaa
02/07/10 20:53
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 ;-)
aaa
02/07/10 21:09
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:
Il mio blog: piero.dev
02/07/10 21:11
TheKaneB
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
aaa
02/07/10 21:51
qualcuno
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?)
aaa
03/07/10 8:28
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
aaa
03/07/10 8:38
qualcuno
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. :)
aaa
03/07/10 12:06
Alex
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...
aaa