#define SWAP(x, y) {(x)^=(y)^=(x)^=(y);}
위와같은 SWAP 매크로가 있다.
이제 이 매크로를 한번 풀어 보겠다.
int main()
{
int x = 10;
int y = 20;
printf("X = %d, Y = %d", x, y);
x ^= y ^= x ^= y; //SWAP(x, y);
printf("X = %d, Y = %d", x, y);
return 0;
}
위과 같이 매크로가 풀릴것인데... 이것을 하나씩 뜯어보면
제일 뒤에것 부터 x ^= y;
이걸 다시 풀어쓰면 x = x^y;
자 그럼 x와 y를 2진수로 풀어 보겠다.
x : 00001010 (10진수 : 10)
y : 00010100 (10진수 : 20)
^모양은 XOR하란 말이므로 위의 두 2진수를 XOR 시키면
x^y = 00011110
그럼 이 값이 x에 들어갔을 것이다.
그럼 다음인 y ^= x;
이것도 다시 풀어쓰면 y = y^x;
x : 00011110
y : 00010100
XOR 시키겠다.
y^x = 00001010
이 값 또한 y에 들어가게 된다.
이제 마지막으로 x ^= y;
풀어보면 x = x^y;
x : 00011110
y : 00001010
XOR 시키겠다.
x^y = 00010100
x에 마지막으로 값이 들어 갔다.
그럼 최종적인 값을 확인해 보겠다.
x : 00010100 (10진수 : 20)
y : 00001010 (10진수 : 10)
자 어떤가...
추가적인 변수 없이 비트연산만으로 SWAP구현이 가능하다.
보기쉽게 코드화 하면
x = x ^ y;
y = y ^ x;
x = x ^ y;
과 같이 쓸 수 있다.
또하나의 방법을 보겠다.
x = x + y;
y = x - y;
x = x - y;
이정도는 +, - 만 할줄 안다면 풀이가 가능하니
풀이는 하지 않겠다...
이처럼 여러가지 방법으로 추가적인 변수 없이 SWAP 구현이 가능하다.