[C언어] Swap하기
프로그래밍 언어로 변수의 값은 어떻게 Swap 해야 할까?
1. Swap using temporary variable
먼저 임시 변수(temporary variable)를 사용하는 방법이 있다.
내가 int형 변수 a와 b의 값을 바꿔주고 싶다고 해보자.
int a = 3;
int b = 5;
만약에 내가
a = b의 원래 값;
b = a의 원래 값; 위와 같은 형식으로 두 변수의 값을 바꿔주려면 임시 변수가 하나 필요하다.
왜냐하면, 내가 a = b를 하는 순간 a의 원래 값은 b의 값으로 덮어씌워 져서 잃어버리기 때문이다.
내가 a = b를 하고 싶은데 a의 원래 값도 보존하고 싶다면 어떻게 해야 할까?
int temp = a;
위와 같이 임시 변수(temp)에 a값 원래 값을 저장해 놓고 a에 b값을 저장하면 된다.
이렇게 하면 나중에 a가 변형되고 난 후 a의 원래 값이 필요하게 되면 temp를 쓰면 된다.
따라서 변수 a와 b를 Swap 하는 코드는 다음과 같이 완성된다!
int a = 3;
int b = 5;
int temp = a; // a의 original값 임시 저장
a = b;
b = temp; // temp는 a의 original값!
2. Swap using XOR
두 번째 방법으로 XOR연산을 사용하여 Swap 하는 방법이 있다.
변수 두 개의 값을 Swap 하기 위해서는 a = b와 같이 a의 값을 바꾸는 순간 a의 원래 값을 잃어버리는 문제를 해결해야 했다.
첫 번째 방법으로 a의 원래 값을 보존하기 위해 임시 변수를 사용했지만 다른 방법은 없을까?
XOR연산을 활용하면 된다!
[참고 1] 여기에서 쓰이는 XOR연산에 대해 간단히 설명을 해 보겠다.
X XOR X = 0
X XOR 0 = X
XOR은 교환 법칙과 결합 법칙이 성립한다.
비트 연산을 잘 활용하면 a와 b의 값을 동시에 저장할 수 있다.
예를 들어서, a ^ b와 같은 값은 a와 b의 값을 동시 저장하고 있다고 볼 수 있다.
a ^ b에 (^ a) 연산을 하면 b가 나오고 a ^ b에 (^ b) 연산을 하면 a가 나온다!
(∵ a^b^a = a^a^b = 0^b = b, a^b^b = a^0 = a)
[참고 2]
C언어에서 XOR 연산자의 키워드로 '^'을 쓴다.
따라서 임시 변수 없이 Swap 코드는 다음과 같이 작성 할 수 있다.
int a = 3; // 이때의 a값, 원래 a의 값을 a'이라 하자.
int b = 5; // 이때의 b값, 원래 b의 값을 b'이라 하자.
a = a ^ b;
b = a ^ b; // 좌변(a ^ b): (a'^b')^b' = (b'^b')^a' = 0^a' = a' 즉, b=a'랑 동일.
a = a ^ b; // 좌변(a ^ b): (a'^b')^a' = (a'^a')^b' = 0^b' = b' 즉, a=b'랑 동일.