Computer >> 컴퓨터 >  >> 프로그래밍 >> C 프로그래밍

C/C++에서 산술 연산자 없이 두 정수 더하기 – 비트 연산 원리와 예제

프로그래밍을 하다 보면 + 연산자를 사용하지 않고 두 수를 더해야 하는 경우가 있습니다. 이 글에서는 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);

이처럼 비트 연산만으로도 산술 연산자 없이 정수 덧셈을 구현할 수 있으며, 임베디드 시스템이나 저수준 최적화가 필요한 환경에서 유용하게 활용됩니다.