프로그래밍을 하다 보면 + 연산자를 사용하지 않고 두 수를 더해야 하는 경우가 있습니다. 이 글에서는 C/C++에서 비트 연산자(XOR, AND, 시프트)만을 활용해 두 정수의 합을 구하는 방법을 예제와 함께 살펴보겠습니다.
예제 코드
#include <iostream>
using namespace std;
int add(int val1, int val2) {
while (val2 != 0) {
int c = val1 & val2; // 자리올림(carry) 계산
val1 = val1 ^ val2; // 자리올림을 제외한 합
val2 = c << 1; // 자리올림을 한 자리 위로 이동
}
return val1;
}
int main() {
cout << "두 수의 합 : " << add(28, 8);
return 0;
}실행 결과
두 수의 합 : 36
코드 설명
위 프로그램에서는 int형 매개변수 두 개를 받는 add() 함수가 정의되어 있으며, 실제 덧셈 로직은 이 함수 안에 구현되어 있습니다.
int add(int val1, int val2) {
while (val2 != 0) {
int c = val1 & val2;
val1 = val1 ^ val2;
val2 = c << 1;
}
return val1;
}동작 원리
핵심 아이디어는 2진수 덧셈을 흉내 내는 것입니다.
- XOR(
^) 연산: 자리올림을 고려하지 않은 상태에서 각 비트를 더한 결과를 얻습니다. - AND(
&) 연산: 두 비트가 모두 1인 위치, 즉 자리올림이 발생하는 지점을 찾아냅니다. - 왼쪽 시프트(
<< 1): 발생한 자리올림을 한 자리 위로 옮겨 다음 단계의 덧셈에 반영합니다.
이 과정을 자리올림 값이 0이 될 때까지 반복하면, 최종적으로 val1에 두 수의 진짜 합이 저장됩니다.
단계별 예시: 28 + 8
- 28(11100) XOR 8(01000) = 20(10100), AND 결과 8(01000) → 시프트 후 16(10000)
- 20 XOR 16 = 4(00100), AND 결과 16 → 시프트 후 32(100000)
- 4 XOR 32 = 36, AND 결과 0 → 반복 종료
따라서 최종 결과는 36이 됩니다.
main() 함수
main() 함수에서는 add() 함수를 호출하여 그 결과를 화면에 출력합니다.
cout << "두 수의 합 : " << add(28, 8);
이처럼 비트 연산만으로도 산술 연산자 없이 정수 덧셈을 구현할 수 있으며, 임베디드 시스템이나 저수준 최적화가 필요한 환경에서 유용하게 활용됩니다.