Mi-am adus aminte de un mic truc pe care îl foloseam în liceu şi dintr-un motiv necunoscut nu l-am mai folosit de mult, până la un laborator de Sisteme de Operare: schimbarea mai eficientă a unei variabile.
Metoda clasică este folosirea unei variabile auxilitare în care se păstrează una din variabile. A două metodă este folosirea XOR (sau exclusiv).
var1 = var1 XOR var2
var2 =var1 XOR var2
var1 = var1 XOR var2
Partea cea mai bună este că nu este dependentă de tipul de date şi teoretic s-ar putea schimba orice. Astfel, se poate crea uşor şi un macro pentru uz general. Folosind ultimul best practice învăţat despre macro-uri ( encapsularea codului funcţiei într-un do while(0) ), codul în C ar arăta aşa:
#define swap(a, b) \
do \
{ \
(a) = (a) ^ (b); \
(b) = (b) ^ (a); \
(a) = (a) ^ (b); \
}while(0) \


Sunday, 31. May 2009
Nu merge cu pointeri, trebuie sa faci cast la ceva.
Şi în plus, e prea lung:
a = a^b^(b=a);
SAU:
a^=b^=a^=b;
Sunday, 31. May 2009
Salut, de partea cu XOR stiam si eu insa, citisem intr-o carte, cred ca se numea “hacker’s delight” ca poti folosi XOR insa numa pentru tipul de date int. As fi interesat daca poti explica putin treaba cu best practice.
Multumesc, cu respect Boboc Sabin !
Sunday, 31. May 2009
@Sabin: http://en.wikipedia.org/wiki/C_preprocessor caută ‘while(0)”
Monday, 1. June 2009
http://en.wikipedia.org/wiki/XOR_swap_algorithm
Apropo de ce zicea Lucian
The body of this function is sometimes seen incorrectly shortened to if (x != y) *x^=*y^=*x^=*y;. This code has undefined behavior, since it modifies the lvalue *x twice without an intervening sequence point.
Saturday, 6. June 2009
Sau baga la compilare un -O3 si nu mai risti sa introduci buguri inutile.