题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用 +、-、*、/ 四则运算符号。
分析:
& 按位与运算:相同位的两个数字都为 1,则为 1;若有一个不为 1,则为 0。两个数相与,并左移一位:相当于求得进位。
如:1&1=1 将 1 左移一位变成了 10,相当于拿到了进位。
^ 按位异或运算:相同位置不同则为 1,相同则为 0。相当于每一位相加,而不考虑进位。
十进制两个数相加可以进行分解为三个步骤:
1、各位的值进行相加,不算进位的值
2、计算进位的值
3、两者相加即为和
例子:5 + 7 = 12,三步走。
5 --> 101 7 --> 111
第一步:相加各位的值,不算进位,得到 010,二进制每位相加就相当于各位做异或操作,101^111。
第二步:计算进位值,得到 1010,相当于各位做与操作,得到 101,再向左移一位,得到 1010,(101 & 111) << 1。
第三步:重复上述两步,各位相加 010 ^ 1010 = 1000,进位值为 (010 & 1010) << 1 = 100,继续重复上述两步,1000 ^ 100 = 1100,进位值为 0,跳出循环,1100 为最终结果。
public class Solution { public int Add(int num1,int num2) { int result = 0; int carry = 0; do { result = num1 ^ num2; // 不带进位的加法 carry = (num1 & num2) << 1; // 进位 num1 = result; num2 = carry; } while(carry != 0); // 进位不为 0 则继续执行加法处理进位 return result; } }