不用+号算加法(位运算实现)


最近在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;
}

最后感谢大家观看~

不用+号算加法(位运算实现)_第1张图片

 

你可能感兴趣的:(学习,c语言)