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

题意描述

写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。

解题思路

位运算

首先来看十进制加法如何计算的(33+59)

  1. 相加各位的值,不进位,结果是82,(3+9 = 12,舍弃进位就是2。3+5=8,没有进位是8)
  2. 计算进位,结果就是10
  3. 将上述的到的两个值重复步骤1和步骤2,直到进位为0,返回不进位的值。
  4. 82+10 (各位相加,不进位是92。进位是0,返回92)

对于二进制也可以使用相同的方法

  1. 相加各位的值,不进位,结果是26(100001+111011 = 011010),就是相同得0,不同得1。符合异或运算,可以使用^进行计算。
  2. 计算进位,也就是只保留相同的位,(100001+111011 = 100001),既然是进位制,所以还应该左移一位,得到1000010,在位运算中可以用(num1 & num2) << 1表示。
  3. 重复上述步骤,直到进位为0,返回进位的值。
    public int Add(int num1,int num2) {
           int sum = num1 ^ num2;
           int carry = (num1 & num2) << 1;
           if(carry == 0){
           		return sum;
           }else{
           		return Add(sum,carry);
           }
        }
posted @ 2020-03-14 14:36  灵图  阅读(122)  评论(0)    收藏  举报