zerofly's Blog

努力不一定成功,但不努力一定不会成功

0%

不适用四则运算符计算两个数的和


题目描述

写一个函数,求两个整数之和,要求在函数体内不得使用+,-,*,/四则运算符。

解题思路

首先两个整数正常相加的过程主要是通过三步: 例如 5 + 7 = 12

  • 将各位相加,不进位;为 2
  • 计算进位值,10;
  • 然后,变为10 + 2,继续循环以上两步,直到没有进位(进位值为0); ==》12

对应二进制计算: 5——101, 7——111

  • 将各位相加,不进位;得到010,可发现二进制相加类似于异或操作 101 ^ 111 = 010
  • 计算进位值,1010,可发现二进制进位类似于与操作之后向左平移1101 & 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

文章作者:zerofly

发布时间:2020年06月03日 - 09:06

原始链接:http://zeroflycui.github.io/801cb1c0.html

许可协议: 转载请保留原文链接及作者。