题目:
写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
链接:
剑指Offer(第2版):P310
思路标签:
- 算法:位运算
解答:
- 在十进制的运算中,如25+8=33,我们分步骤进行:
- 各位相加不进位:5+8=3,2+0=2,得到23;
- 只记录进位:5+8的进位值为1,向前进一位成为10;
- 前两步结果相加:23+10=33.
- 既然不能使用四则运算,那么就使用位运算,发现位运算也是存在这样的分布进行关系;
- 二进制位运算分步进行:
- 两个数相加不进位,则相当于进行位异或运算^(0+1=1,1+0=1,0+0=0,1+1=0);
- 两个数只看进位,则相当于进行位与运算&(0&0=0、1&1=1、0&1=0、1&0=0),再将进位前进一位;
- 前两步结果相加。
class Solution {
public:
int Add(int num1, int num2)
{
int sum, carry;
do{
sum = num1^num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}while(carry != 0);
return num1;
}
};
相关问题:
不使用新变量,交换两个变量的值。如a和b进行交换。
方法1:基于加减法
a = a + b
b = a - b
a = a - b
方法2:基于异或运算
a = a^b
b = a^b
a = a^b