加法的位运算实现

Lintcode 1. A + B Problem

Solution:

 1     int aplusb(int num1, int num2) {
 2 
 3         if(num2==0) return num1;//没有进位的时候完成运算     
 4     
 5         int sum,carry;     
 6     
 7         sum=num1^num2;//完成第一步没有进位的加法运算     
 8     
 9         carry=(num1&num2)<<1;//完成第二步进位并且左移运算     
10     
11         return aplusb(sum,carry);//进行递归,相加  
12 
13     }

 

 

接下来来分析一下这个程序设计的思路:

对于加法 : a + b 

按照这个程序的思路可以把加法分为两个部分:

  第一个部分:不产生进位的时候的和

  第二个部分:一个可以用来表示这一次加法运算中所有进位的数

 

根据上面的描述:

  第一部分:a^b

  第二部分:(a&b)<<1 

 

注: 第二部分为什么要右移一位,例如一个两位二进制的数 01 & 01  , 是第一位(右边是低位)产生了进位,当时对第二位产生了影响,所以所得结果应为10

 

然后不断重复这两个部分,当没有无进位发生的时候,纯粹的 a^b 即为 a+b

 

参考连接:

 https://www.cnblogs.com/luowei010101/archive/2011/11/24/2261575.html

posted @ 2019-09-30 15:36  virgil_devil  阅读(759)  评论(0编辑  收藏  举报