不用加减乘除做加法
题目 不用加减乘除做加法
思路分析
不让用加减乘除 那就考虑位运算 十进制加法转换成二进制再做加法 结果是一样的
之前有一个-x=~x+1 但也只是能做到将a+b变成a--b 还是要用减法
那么换一个角度思考 模拟一下计算
手写加法的时候 不外乎就是做两件事 算两位的和 再看上一位有没有进位 再加上去
\(a{i}\)+ \(b{i}\) + 进位
那不妨把拆开来
先算 \(a{i}\)+ \(b{i}\) 之后再考虑进位
对于二进制来说 \(a{i}\)+ \(b{i}\) 相当于\(a{i}\)^ \(b{i}\)
相同为0 不同为1
0+0=0^0=0
0+1=0^1=1
1+0=1^0=1
1+1=1^1=1
所以不考虑进位的加法直接就是 \(a{i}\)^ \(b{i}\)
那么进位怎么办
只有1 1的时候才会进位吧
进位进的是1
那么要1 1得1
显然是&
但是这个进位应该是进在下一位
所以于\(a{i}\)& \(b{i}\) << 1
ok 这样一来 $a{i} $ \(b{i}\) 进位 就都有了
代码实现
class Solution {
public:
int add(int num1, int num2){
while(num2)
{
int sum=num1^num2;
int carry=(num1 & num2)<<1;
num1=sum,num2=carry;
}
return num1;
}
};
💬 评论