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


思路:
& 按位与运算:相同位的两个数字都为1,则为1;若有一个不为1,则为0。两个数相与,并左移一位:相当于求得进位
  如:1&1=1 将1左移一位变成了10,相当于拿到了进位
^ 按位异或运算:相同位置不同则为1,相同则为0。相当于每一位相加,而不考虑进位

  • 第一步 异或——无进位相加得result1 (a^b)
  • 第二步 与+左移一位——求得进位result2 (a&b)<<1
  • 第三步 result = result1 + result2即是结果

但问题在于,result1 + result2可能还有进位,因此result还要重复一二步这个过程。直到没有进位,异或的结果就是最终的结果为止
如 101 + 011 -> 110 + 1010 -> 1100 + 0100 -> 1000 + 1000 -> 0 (异或出现了0,返回上一次异或的结果)
最终得到的是1000 也就是5+3=8


public class Solution {
      public int Add(int num1,int num2) {
             while (num2!=0) {
                int temp = num1^num2;
                num2 = (num1&num2)<<1;
                num1 = temp;
            }
            return num1;
        }
}