>> Edit article
이름
제목
패스워드
잘 기억이 나지 않아 정확한지는 모르겠지만 ((a)^=(b)^=(a)^=(b)) 의 경우 xor a,b xor b,a xor a,b 로 작동하겠지요 a ^= b는 a와 b의 xor을 a에 대입하는 것이 아닙니다. 그리고 만약 xor 명령어 자체가 메모리가 아닌 레지스터만으로 연산한다고 해도 (잘 기억이 안나서 정확히는 답변이 안되겠네요. 하지만 가물가물한 기 억으로는 dest 쪽만 레지스터이면 될껍니다) mov eax, a mov ebx, b xor eax, ebx xor ebx, eax xor eax, ebx 요로코롬 되면 끝날겁니다. ((c)=(b),(b)=(a),(a)=(c)) 의 경우 말씀하신데로 6번이 되겠네요. mov 의 경우 둘중 하나면 레지스터이면 될테니... (아닌가??? 기억이 가물가 물... 어셈한지 한 7-8년 된듯한디 -.-) mov eax, c mov a, eax mov eax, a mov b, eax mov eax, b mov c, eax 아 위의 코드들은 대충 의사코드임다. 정확한 자료가 아니라 -.-;; 님께서 말씀하신데로 컴파일러에 따라 많은 차이가 있겠네요 ^^ 근데 위의 xor 방식은 예전부터 속도를 위해서 많이 쓰던 방식이라 괘않은 컴파일러라면 잘 찾아서 해줄듯 한디... 잘 모르겠네엽... ^^ 아 그리고 정말 기억이 가물가물해서 맞는지도 잘 모르겠습니다만은... 어쨌 거나 xor이 mov보다는 명령 자체만으로도 속도가 더 빨랐던 것으로 기억납니 다. 그럼 즐프... : ((a)^=(b)^=(a)^=(b)) 의 경우 : mov 연산 6번에 xor 연산 3번에 사용되고 : ((c)=(b),(b)=(a),(a)=(c)) 의 경우 : mov 연산 6번 만 하면 되는 걸로 기억되는데요.. : 맞는지 틀린지는 한번 확인해 봐야 되겠군요. : 아.. 참.. 컴파일러 마다 조금씩은 틀리겠군요. : 제가 말한 것은 바보같은 VC++의 얘기 입니다. : : : 매크로를 써서 속도를 높인다면 : : 님이 생각하신 방법보다는 원문의 XOR을 이용한 것이 더욱더 빠릅니다. : : 대입의 경우 내부적으로 mov 명령어로 처리되며 XOR의경우는 xor로 처리 됩니다. : : mov 명령어 보다 xor 명령어가 훨씬 빠릅니다. : : : : 그럼 즐프... : : : : : 음냐.. 컴파일 되겠죠? 잘 모르겠당... ^^; : : : 어짜피 함수 호출하는 거는 시간 많이 걸리는 건 당연하고.. : : : 매크로를 써서 속도를 높일 거면 이 왕 하는 거 좀 더 빠르게.. : : : 요렇게 하면 연산 횟수가 9번에서 6번으로 줄 거 같은디... : : : : : : <pre> : : : #include < stdio.h > : : : : : : //#define SWAP(a, b) ((a)^=(b)^=(a)^=(b)) : : : #define SWAP(a, b) ((c)=(b),(b)=(a),(a)=(c)) : : : int c; : : : : : : int main(void) { : : : int a = 22; : : : int b = 44; : : : : : : SWAP(a, b); : : : : : : printf("a = %d, b = %d", a, b); : : : : : : return 0; : : : } : : : </pre> : : -- : -----
Copyleft
1999-2026 by
JSBoard Open Project
Theme Designed by
IDOO
All right reserved