题目描述:https://www.nowcoder.com/practice/59ac416b4b944300b617d4f7f111b215?tpId=13&&tqId=11201&rp=1&ru=/ta/coding-interviews&qru=/ta/coding-interviews/question-ranking

  如图:先看一下 6 + 4 = 10 的二进制运算:
图片说明
  首先可以看出,前 n 位我们在进行加操作的时候相当于按位异或运算(相同为 0, 不同为 1),考虑完了这个问题以后我们就可以考虑此时的进位情况,产生进位的情况有:两个都为 1,相当于按位与操作以后得到了一个 1,然后将这个 1 左移一位就是其前面一位的进位,然后再将按位异或得到的结果与得到的进位情况得到异或运算,直到没有进位产生了为止。由于在计算机中负数是以补码的形式存储的,所以我们在计算负数相加的时候也可以模拟这个过程(无符号整型)。

public class Solution {
    public int Add(int num1,int num2) {
        while(num2 != 0) {
            int val = (num1 & num2) << 1;
            num1 ^= num2; 
            num2 = val;
        }
        return num1;
    }
}