题目描述
写一个函数,求两个整数之和,要求在函数体内不得使用+,-,*,/四则运算符。
解题思路
首先两个整数正常相加的过程主要是通过三步: 例如 5 + 7 = 12
- 将各位相加,不进位;为
2
- 计算进位值,
10;
- 然后,变为10 + 2,继续循环以上两步,直到没有进位(进位值为0); ==》12
对应二进制计算: 5——101, 7——111
- 将各位相加,不进位;得到
010,可发现二进制相加类似于异或操作 101 ^ 111 = 010
- 计算进位值,
1010,可发现二进制进位类似于与操作之后向左平移1 ,101 & 111 = 101 << 1 = 1010
- 然后,变为010 + 1010,继续循环以上两步,直到没有进位(进位值为0);
代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| class Solution { public: int Add_Solution(int num1, int num2) { int temp1 = num1; int temp2 = num2; if (temp2 == 0) return num1; while (temp2 != 0) { temp1 = num1 ^ num2; temp2 = (num1 & num2) << 1; num1 = temp1; num2 = temp2; } return temp1; } };
|
1 2 3 4 5 6 7 8 9
| class Solution { public: int Add(int num1, int num2) { return num2 ? (Add(num1 ^ num2, (num1 & num2) << 1)) : num1; } };
|
参考博文链接:https://cuijiahua.com/blog/2018/01/basis_48.html