Programming/C2008. 12. 7. 21:59

#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 구현이 가능하다.

Posted by skensita