#define SWAP(x, y) ( x ^= y ^= x ^= y)
posted by Helio Tejedor @ 1:42 AM
Qué guapo! No me lo había pensado nunca! Nada de if-then-else, operaciones bit-wise super eficientes, y además como macro. Fantástico!
Suposant que cost(XOR)=cost(MOV)opció 1: XOR AX, BX XOR BX, AX XOR AX, BXopció 2: MOV CX, AX MOV AX, BX MOV BX, CXLa opció 1 necessita un registre menys !, a més per al segon cas has de suposar que el compilador de C ho optimitzarà correctament, en la opció 1 no té més alternativa :pVoto opció 1 !
Ahora viene cuando la matan, ¿por qué el siguiente código no chuta con el g++?void swap(int* x, int* y) { *x ^= *y ^= *x ^= *y;}
O el siguiente:template<typename T> void swap(T& x, T& y) { x ^= y ^= x ^= y;}
JO... pues no, no lo sé. Algo tendrán que ver los punteros :-D
Post a Comment
<< Home
5 Comments:
Qué guapo! No me lo había pensado nunca! Nada de if-then-else, operaciones bit-wise super eficientes, y además como macro. Fantástico!
Suposant que cost(XOR)=cost(MOV)
opció 1:
XOR AX, BX
XOR BX, AX
XOR AX, BX
opció 2:
MOV CX, AX
MOV AX, BX
MOV BX, CX
La opció 1 necessita un registre menys !, a més per al segon cas has de suposar que el compilador de C ho optimitzarà correctament, en la opció 1 no té més alternativa :p
Voto opció 1 !
Ahora viene cuando la matan, ¿por qué el siguiente código no chuta con el g++?
void swap(int* x, int* y) {
*x ^= *y ^= *x ^= *y;
}
O el siguiente:
template<typename T> void swap(T& x, T& y) {
x ^= y ^= x ^= y;
}
JO... pues no, no lo sé. Algo tendrán que ver los punteros :-D
Post a Comment
<< Home