剑指offer系列38:不用加减乘除做加法

主要记住一点:对于数字的运算除了减加乘除之外就是位运算。位运算包括与或非异或。然后看如何将两个数相加转换成位运算。因为计算机是二进制,所以按照二进制的思路去想。分为两部分,分别是:对于不用进位的位的加法操作相当于异或:相同为0,不同为1;对于要进位的位,也就是两个1,可以看成是与之后左移一位。以上两个方法分别说了如何处理两个数中不用进位的位的加法和需要进位的加法操作。最后一步就是将上面两步操作的结果加起来。注意第三部也是加操作等于要调用自己的加操作函数。所以使用到了递归。

 1 class Solution {
 2 public:
 3     int Add(int num1, int num2)
 4     {
 5         if (num1 == 0)//注意要写特殊数据的处理
 6             return num2;
 7         if (num2 == 0)
 8             return num1;
 9         int tem = num1^num2;//第一步:对两个数作异或,对于不需要进位的位相加
10         if (num1&num2 == 0)//递归终止条件
11             return tem;
12         else
13         {
14             int tem2 = (num1&num2) << 1;//第二步:对两个数作与操作后左移一位,对于需要进位的位相加
15             return Add(tem, tem2);//第三步:对前两部的结果相加,调用自己,递归
16         }
17     }
18 };

 

posted @ 2019-07-23 11:20  妮妮熊  阅读(159)  评论(0编辑  收藏  举报