解析:例如计算(5,17)
5的二进制是101,17的二进制是10001。将计算分为三步:
(1) 各位相加但不计进位,得到的结果是10100;
(2) 记下进位,在这个例子中只在最后一位相加时产生一个进位,结果是二进制的10;
(3) 把前两步的结果相加,得到的结果是10110,转换乘十进制正好是22
接下来试着把二进制的加法用位运算来替代,
(a) 不考虑进位对每一位相加,0加0、1加1的结果都是0,0加1、1加0的结果是1;这和异或
的结果是一样的,对异或而言,0和0、1和1或异的结果是0,而0和1,、1和0的异或结果是1.
(b) 接着考虑第二位进位,对于0加0、0加1、1加0而言,都不会产生进位,只有1加1时
会向前产生一个进位,此时可以想象成是两个数先做位运算,然后在向左移一位,
只有两个数都是1的时候,位与得到的结果是1,其余都是0.
(c) 把前两个步骤的结果相加.相加的过程依然是重复前两步,直到不能进位为止。
#include<iostream>
#include<stdio.h>
#include<string.h>
using namespace std;
void BinaryRecursion(int n){
if (n == 0){
return;
}else{
BinaryRecursion(n / 2);
n = n % 2;
cout << n;
}
}
int Add(int num1,int num2) {
int sum,carry;
while(num2 != 0) {
cout<<"num1:";BinaryRecursion(num1);cout <<endl;
cout<<"num2:"; BinaryRecursion(num2);cout <<endl;
sum = num1 ^ num2;
cout<<"num1 ^ num2" << sum <<":";
BinaryRecursion(sum);
cout<<endl;
cout<<"num1 & num2"<<":";BinaryRecursion(num1 & num2);cout<<endl;
carry = (num1 & num2) << 1;
cout<<"carry:" << carry<<":";
BinaryRecursion(carry);
cout<<endl;
num1 = sum;
num2 = carry;
}
return num1;
}
int main() {
cout<<Add(15,63)<<endl;
}