이것은 XOR 이라는 비트연산의 특성을 이용한 방법
XOR은 같은 값으로 연산을 두번 시켜주면 다시 원래대로 돌아오는 특성을 가지고 있다
예를 들어 두 값 A, B 가 있고 처음 XOR을 했을 때의 값을 X 라 한다면
A ^ B = X
X ^ B = A
X ^ A = B
그래서 XOR연산은 데이타 암호화의 가장 기본이 되는 연산으로 쓰이고 있다
A가 암호화할 문장, B가 암호 키, X가 암호문으로
자세한 것은 데이타 암호화를 찾아보시라
#define SWAP( a, b ) a ^= b; b ^= a; a ^= b;
이것을 부분별로 나눠보면 다음과 같다
1) 초기값 : a(A), b(B)
2) a ^= b 가 실행된 후 : a(X), b(B) (a = a ^ b = A ^ B = X)
3) b ^= a 가 실행된 후 : a(X), b(A) (b = a ^ b = X ^ A = B)
4) a ^= b 가 실행된 후 : a(B), b(A) (a = b ^ a = X ^ B = A)
* XOR은 순서가 바뀌어도 상관없다 A ^ B = B ^ A
하지만 위와 같이 데이타 타입이 없는 경우 조금 위험하게 쓰일 수도 있으니 차라리 inline을 쓰는 것이 좋다
#define은 타입체킹을 하지 않으니 서로 다른 두 타입이 들어오면 문제가 발생할 수 있다
template<class A, class B>
inline void Swap( A &a, B &b ) { a ^= b; b ^= a; a ^= b; }
* 단, 이것은 C++에서나 사용가능
C에서는 어쩔 수 없이 위의 #define 방법을 사용해야된다.
'Programming > C / C++' 카테고리의 다른 글
__IN & __OUT (0) | 2015.02.07 |
---|---|
strncpy 의 함정 (0) | 2015.02.07 |
struct tm (0) | 2015.02.07 |
Lotto (0) | 2015.02.07 |
Quick Cast (0) | 2015.02.07 |