새로운 변수 안쓰고 두 변수 값 바꾸기

보통 "두 변수의 값을 바꾸는 코드를 짜라" 라고 들으면 아래와 같이 하는게 일반적입니다

int a = 1;
int b = 2;

int temp = a;
a = b;
b = temp;

 

새로운 변수를 만들어서 기존 변수의 값을 저장하기 마련이죠

그러나~ 그렇게 하지 않고도 두 변수의 값을 바꿀수 있답니다. 면접문제로도 자주 나온다고 하죠

뭘까요? 한번 고민해보시는 것도 좋겠죠?

 

 

...

 

 

 

정답은..xor 연산자를 쓰면 된답니다.

어떻게 그게 가능하냐? 라고 생각하시는 분들이 당연히 있겠지요. 저도 첨 들었을 때 그랬거든요.

사실은 이렇습니다:

  • XOR 연산자는 두 값이 다를 때만 참을 반환합니다. 
  • 이걸 이용해서 두 변수에 XOR연산자를 세번 사용하면 값을 바꿀 수 있습니다.

 

예를 보면서 이해해봅시다.

 

8비트 정수형 변수 A와 B 두개의 값을 바꾸고 싶다 가정해봅시다. (A = 15, B = 48)

둘을 이진수로 표현하면

A = 0000 1111,

B = 0011 0000

 

이제 XOR 연산자를 적용해보면:

0000 1111

0011 0000

---------------------

0011 1111

 

서로의 공통되는 부분은 제외하고, 겹치지 않는 부분만 따로 빼주는 것이 됩니다.

벤 다이어 그램으로 표현하면 아래와 같습니다. (왼쪽 동그라미가 A, 오른쪽이 B라고 가정합니다)


 

위의 결과를 각 변수에 xor연산으로 적용해준다면 어떻게 될까요?

공통되는 부분은 비어있으니 가져가고, 원래가지고 있던 자기 값은 버리고, 겹치지 않는 다른 변수의 부분을 가져오게 되는것이죠.

 

코드로 표현하면 아래와 같습니다.

int a = 15;  // 이진수: 0000 1111
int b = 48;  // 이진수: 0011 0000

a = a ^ b;   // 0000 1111 xor 0011 0000 = 0011 1111
b = a ^ b;   // 0011 1111 xor 0011 0000 = 0000 1111 = 15
a = a ^ b;   // 0011 1111 xor 0000 1111 = 0011 0000 = 48

 

신기하죠? 이진수를 이해하면 이런 재미있는 것들도 가능하다는 사실..

더 자세한게 궁금하신 분들은 binary hacks라는 책을 참고해보시는 걸 추천드립니다.

  • share