C 프로그래밍에서 두 변수의 값을 맞바꾸는(swap) 방법은 여러 가지가 있지만, 그중 비트 연산자(Bitwise Operator)를 사용하면 임시 변수(temp) 없이도 간단하게 값을 교환할 수 있습니다. 이번 글에서는 XOR(^) 연산을 이용해 두 숫자를 교환하는 방법을 단계별로 살펴보겠습니다.
문제 상황
C 언어에서 비트 연산자를 사용하여 두 개의 숫자를 서로 바꾸려면 어떻게 해야 할까요?
해결 방법
컴파일러는 먼저 입력받은 10진수를 2진수(binary)로 변환한 뒤, 두 값에 대해 비트 단위 XOR 연산을 수행합니다. XOR 연산은 세 번 반복되면서 각 변수에 저장된 값이 메모리상에서 서로 교환되는 원리입니다.
XOR 연산의 핵심 성질은 다음과 같습니다.
- 같은 비트끼리 XOR하면 0이 됩니다. (x ^ x = 0)
- 0과 XOR하면 자기 자신이 유지됩니다. (x ^ 0 = x)
- 교환 법칙과 결합 법칙이 성립합니다.
알고리즘
START
Step 1: 두 개의 변수 a와 b 선언
Step 2: 콘솔에서 두 개의 숫자 입력받기
Step 3: 비트 연산자(XOR)를 사용하여 두 숫자 교환
a = a ^ b
b = a ^ b
a = a ^ b
Step 4: a와 b의 값 출력
STOP
프로그램 코드
#include<stdio.h>
int main(){
int a,b;
printf("enter the values for a and b:");
scanf("%d%d",&a,&b);
printf("value of a=%d and b=%d before swap\n",a,b);
a= a^b;
b= a^b;
a= a^b;
printf("value of a=%d and b=%d after swap",a,b);
return 0;
}
실행 결과
enter the values for a and b:24 56 value of a=24 and b=56 before swap value of a=56 and b=24 after swap
동작 원리 설명
입력값으로 a=24, b=56을 넣었을 때 내부적으로 어떻게 교환이 일어나는지 2진수로 확인해 보겠습니다.
- a = 24 → 2진수:
011000 - b = 56 → 2진수:
111000
- a = a ^ b →
011000 ^ 111000 = 100000 - b = a ^ b →
100000 ^ 111000 = 011000(원래 a의 값인 24) - a = a ^ b →
100000 ^ 011000 = 111000(원래 b의 값인 56)
최종 결과:
- a =
111000→ 10진수로 56 - b =
011000→ 10진수로 24
이처럼 세 번의 XOR 연산만으로 두 변수의 값이 완벽하게 교환됩니다. 임시 변수를 사용하지 않으므로 메모리를 절약할 수 있다는 장점이 있지만, 가독성이 떨어질 수 있으므로 실무에서는 코드의 명확성을 고려해 적절히 활용하는 것이 좋습니다.