비트 연산자(Bitwise Operator)는 데이터를 구성하는 개별 비트(bit)를 직접 조작하는 연산을 수행하는 연산자입니다. 대표적인 비트 연산자로는 비트 AND(&), 비트 OR(|), 비트 XOR(^) 등이 있습니다.
일반적으로 덧셈은 + 연산자를 사용하지만, 비트 연산자만을 활용해서도 덧셈을 구현할 수 있습니다. 그 원리는 다음과 같습니다.
- XOR(^): 자리올림(carry)을 제외한 두 수의 부분합을 계산합니다.
- AND(&): 자리올림이 발생하는 비트 위치를 찾아냅니다.
- 왼쪽 시프트(<< 1): 자리올림 값을 한 자리 위로 이동시켜 실제 올림값을 만듭니다.
이 과정을 자리올림이 0이 될 때까지 반복하면 최종적인 덧셈 결과를 얻을 수 있습니다. 아래는 비트 연산자를 사용하여 덧셈을 수행하는 C++ 프로그램의 전체 코드입니다.
예제 코드
#include<iostream>
using namespace std;
int main() {
int num1, num2, carry;
cout << "Enter first number:"<<endl;
cin >> num1;
cout << "Enter second number:"<<endl;
cin >> num2;
while (num2 != 0) {
carry = num1 & num2;
num1 = num1 ^ num2;
num2 = carry << 1;
}
cout << "The Sum is: " << num1;
return 0;
}실행 결과
위 프로그램을 실행하면 다음과 같은 출력을 확인할 수 있습니다.
Enter first number:11 Enter second number: 5 The Sum is: 16
코드 단계별 설명
1. 두 개의 숫자 입력 받기
먼저 사용자로부터 덧셈에 사용할 두 개의 정수를 입력받습니다.
cout << "Enter first number:"<<endl; cin >> num1; cout << "Enter second number:"<<endl; cin >> num2;
2. while 루프를 이용한 비트 단위 덧셈
입력받은 두 수의 덧셈은 while 루프 안에서 비트 AND, 비트 XOR, 왼쪽 시프트 연산자를 통해 수행됩니다.
while (num2 != 0) {
carry = num1 & num2; // 자리올림이 발생할 비트를 계산
num1 = num1 ^ num2; // 자리올림을 제외한 부분합 계산
num2 = carry << 1; // 자리올림을 한 자리 위로 이동
}루프가 한 번 반복될 때마다 num2(자리올림 값)가 점점 작아지며, 더 이상 올릴 자리가 없어 num2가 0이 되면 반복이 종료되고 num1에는 최종 합이 저장됩니다.
3. 결과 출력
마지막으로 계산된 합을 화면에 출력합니다.
cout << "The Sum is: " << num1;
동작 원리 예시 (11 + 5)
입력값 11(1011₂)과 5(0101₂)를 예로 들면 다음과 같이 진행됩니다.
- 1회전: XOR → 1110(14), AND 후 시프트 → 1010(10)
- 2회전: XOR → 0100(4), AND 후 시프트 → 10100(20)
- 3회전: XOR → 10000(16), AND 후 시프트 → 00000(0)
num2가 0이 되므로 루프 종료, 최종 결과는 16
이처럼 비트 연산자를 활용하면 산술 연산자 없이도 덧셈을 구현할 수 있으며, 임베디드 시스템이나 저수준 최적화가 필요한 환경에서 유용하게 활용됩니다.