题目描述:写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。
不能使用四则运算,考虑用位运算,位运算针对的是二进制。
|或 ^异或 &与
异或运算:同为0,异为1:0+0=0;1+1=0;1+0=1;0+1=1
位与运算:相同位的两个数字都为1,则为1;若有一个不为1,则为0
以5+17=22为例:
第一种情况:十进制做加法
1)只做各位相加,不进位:
个位数:5+7不进位是2 十位数:0+1是1
2)做进位:5+7有进位,进位值为10
3)前面两个结果相加:12+10=22即5+17=22
第二种情况:二进制
5的二进制 101
17的二进制10001
1)各位相加不进位:10100(两个都是1相加有进位)(101^10001)
2)做进位:只有最有一位相加时产生了进位(101&10001)<<1
3)前面两个结果相加:10110 转换成十进制为22
class Solution {
public:
int Add(int num1, int num2)
{
int sum;carry;% sum 不含进位的和,carry进位
do{
sum = num1^num2;
carry = (num1 & num2) << 1;
num1 = sum;
num2 = carry;
}
while(num2!=0);
return num1;
}
};