題目:
如題所示
思路:
邏輯運算,即二進制運算,無外乎與&、或|、非~、異或^以及移位>>,<<等操作;
而加法運算,在十進制中,只有按位相加以及進位兩個操作。
從二進制角度也一樣,就是bit位相加,加上相應的進位。
1、bit位相加,通過邏輯運算的異或操作可以實現,如0+1=1,1+0=1,0+0=0;
2、進位運算,通過邏輯運算的與操作可以實現,如1+1=1,因為進位是往高位+1,因此需要將進位結果左移一位。
將上述兩個操作再做加法運算,就是加法運算的結果,這是一個遞歸的過程,也可以通過非遞歸即循環來實現。
如求a+b,等價於(a^b)+(a&b)<<1
代碼:
#include <iostream>
using namespace std;
// recursive method
int add_1(int num1,int num2){
if(num1==0)
return num2;
if(num2==0)
return num1;
int num_xor=num1^num2;
int carry=(num1&num2)<<1;
return add_1(num_xor,carry);
}
// non-recursive method
int add_2(int num1,int num2){
int sum=0;
int num3=0;
int num4=0;
while(num1&num2){
num3=num1^num2;
num4=(num1&num2)<<1;
num1=num3;
num2=num4;
}
sum=num1^num2;
return sum;
}
int main()
{
int num1=100;
int num2=200;
cout << add_1(num1,num2) << endl;
cout << add_2(num1,num2) << endl;
return 0;
}
