剑指Offer:面试题47 不用加减乘除做加法

来源:互联网 发布:好玩的2d网络手游 编辑:程序博客网 时间:2024/04/27 23:19

/*
不用加减乘除做加法:
写一个函数,求两个整数之和,要求在函数体内不得使用+,-,*,/四则运算符号

分析:
尝试把二进制的加法用位运算来代替。
第一步不考虑进位对每一位相加。0加0,1加1的结果都是0,因此这里的加法与亦或效果相同。
只有1加1才能进位,即左移一位
想象成是两个数先做位与运算,然后在向左移动一位。只有两个数都是1的时候,位与的结果是1,其余都是0.
第三步相加的过程仍然是重复前面两步,直到不产生进位为止。


输入:
输入可能包含多个测试样例。
对于每个测试案例,输入为两个整数m和n(1<=m,n<=1000000)。
输出:
对应每个测试案例,输出m+n的值。
样例输入:
3 4
7 9
样例输出:
7
16
*/

/*
关键:
1   sum = num1 ^ num2;//因为二进制加与异或结果相同
  pass = (num1 & num2) << 1;//进位同与的效果相同,注意还要左移一位
  num1 = sum;//更新数字
  num2 = pass;
*/

#include <stdio.h>
const int MAXSIZE = 1e6 + 1;

int add_bit(int num1,int num2)
{
 int sum,pass;
 do
 {
  sum = num1 ^ num2;//因为二进制加与异或结果相同
  pass = (num1 & num2) << 1;//进位同与的效果相同,注意还要左移一位
  num1 = sum;//更新数字
  num2 = pass;
 }while(num2);
 return num1;
}

void process()
{
 int num1,num2;
 while(EOF != scanf("%d %d",&num1,&num2))
 {
  printf("%d\n",add_bit(num1,num2));
 }
}

int main(int argc,char* argv[])
{
 process();
 getchar();
 return 0;
}

0 0
原创粉丝点击