剑指offer面试题47:不使用+、-、*、/ 来计算出两个数的和
看到这个题很多人第一时间肯定是懵逼了!!!
不使用+ - * / 四则运算那还要怎么来计算呢??? 面试官会不会在玩我呢???
你要是这么想的话,被面试官知道的话,那么你就别想拿到offer了。。。。
面试的时候,碰到这种题目不要害怕,没有四则运算的我们不是还有位运算的嘛!!!
这个题面试官明显是考你位运算的使用,还有对于数字的敏感度。。。
位运算,就是对于两个数,进行的是二进制操作 ,一个数它不是1 就是0;
而这个题目 ,我们需要的结果的到两个数的和》》》。
1+1 = 0;(加上进位) ;0+1 =1;1+0 = 1 ;0+0=0;;;;
看到这个东西之后我们看的出来 ,这些结果 和 + 运算的结果 与 ^运算的结果是相同的
要是说,到了此处还有问题的话,那就是进位的问题了。
我们都知道,当两个 1相加的话,会产生进位的 (向高位进一位),那么我们只要单独记录下这种情况就可以了,
那要怎么得到这种情况呢???
对比发现,只要使用 & 运算 ,,,当两数的这个位数都是1的情况下,才产生进位。
那么只要将两数 & 后的结果,加到 ^后的结果,那么就会得到正确的结果。。
代码的实现
//面试题:47 不使用四则运算的话 ,来得到两个数 的整数和
//使用的是 位运算
int GetAddTwo(int num1,int num2)
{
//得到两个数的进位值
int carry = (num1 & num2)<<1;
//两数相加的值 (不算上进位)
int add = num1^ num2;
//当什么时候进位为 0,,,表示的就是add就是 相加后的最终值
while(carry)
{
num1 = carry;
num2 = add;
carry = (num1 & num2)<<1;
add = num1 ^ num2;
}
return add;
}