最近在LeetCode上刷题看到一道非常有意思的题,如何不用+号算加法?我觉得挺有意思的故而分享给大家。
在不能使用 + 号的情况下其实很容易想到运用位运算去解决问题,也就是用二进制去表示十进制加法的逻辑。所以我们可以先拆分十进制加法来帮助理解。
十进制相加思想:例如 15+07 , 先计算不考虑进位的相加结果 12 (因为 5+7 的不考虑进位的结果是 2 ,遇 10 进位),然后计算进位 5+7 进位是 10 ,则 10 与 12 再次相加,得到 22 ,进位为 0 ,则计算到此结束。
到此我们就知道了其实二进制加法也可以像这样分开计算求进位与不考虑进位的和当进位为0时结束计算。
具体计算过程如下(例十进制:5 +7):
num1 | num2 | 进位 | 不考虑进位的相加结果 | |
0101 | 0111 | (0101&0111)<<1得到:1010 | (0101^0111)得到:0010 | |
进位数与不进位数继续相加 | 1010 | 0010 | (1010&0010)<<1得到:0100 | (1010^0010)得到:1000 |
进位为0结束 | 0100 | 1000 | (0100&1000)<<1得到:0000 | (0100^1000)得到:1100 |
二进制最后计算结果1100(十进制12)
代码如下:
int Add(int num1, int num2 ) {
while(num2 != 0) {//进位不为0则持续与相加结果进行相加
int tmp = num1 ^ num2;//得到每位相加不考虑进位的数据
num2 = (num1 & num2) << 1;//同1的位相加则会进位
num1 = tmp;
}
return num1;
}
最后感谢大家观看~