巧用位运算: 1、num1 & num2,与运算,得到的是2个数都是1的位置,如果进行加法,则需要进位,m =(num1 & num2)<< 1,得到进位后的数。

2、num1 ^ num2,异或,得到的是2个数1个为0另一个为1的位置,如果进行加法,则不需要进位。n = num1 ^ num2,此时如果m + n得到的就是两数之和,但不能做加法,此时我们想到了或运算。但如果将m、n直接进行或运算,无法保证不进位,于是我们重复以上的过程。

3、while(n & m),当n与上m得0 的时候,即再也不需要进位了,此时将m | n返回即可。

最终代码:

int Add(int num1, int num2 ) {
    int m = 0;
    int n = 0;
    m = (num1 & num2) << 1;  // 需要进位
    n = num1 ^ num2;        //无需进位    此时m + n就是答案,但不能做加法
    while(n & m)   // 检查是否还需要进位
    {
        num1 = m;
        num2 = n;
        m = (num1 & num2) << 1;  //需要进位
        n = num1 ^ num2;        //无需进位
    }
    
    return m | n;
}