不用加减乘除做加法:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
考点:进制转化
思路:
& 按位与运算:相同位的两个数字都为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; } }