剑指-简单-不用加减乘除做加法
题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
思路
(1) 两数做与(&)运算之后二进制保留同为 1 的位置,也就是需要进位的位置。
(2) 两数做异或(^)运算之后二进制保留除了同为 1 以外 1 的位置。
(3) 循环将两数与(&)运算之后进位的结果再和两数异或(^)运算的结果做异或运算。
(4) 直到二进制没有位置进位,则运算完成。
代码
class Solution {
public int add(int a, int b) {
// 任何数 +0 都等于自身,一个数为 0 则直接返回另一个数。
if (a == 0) {
return b;
}
if (b == 0) {
return a;
}
while (b != 0) {
// 与运算得到两个数二进制都为 1 的部分,左位移进位。
int temp = (a & b) << 1;
// 异或运算得到两个数二进制不同时为 1 的 1 部分。
a ^= b;
// 将进位的数继续与 a 做运算,直到没有进位。
b = temp;
}
return a;
}
}