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

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

分析:
尝试把二进制的加法用位运算来代替。
第一步不考虑进位对每一位相加。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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值