思路

试想二进制01011101的相加过程
0 1 0 1
1 1 0 1
其实可以看成是不带进位的结果1000和进位产生的1010相加。

而“不带进位的加法”其实就是异或运算,“进位”其实就是只有两个1的时候才会出现,也就是运算,只是因为进了一位,所以还要往左移动一位。

这样就将两个数相加通过位运算转换成了不带进位的加法结果和进位相加的问题,反复进行下去,最后只要没有进位了,相加的结果也就得到了。

程序

class UnusualAdd {
public:
    int addAB(int A, int B) {
        while(B!=0) {
            int t = A^B;
            B = (A&B)<<1;
            A = t;
        }
        return A;
    }
};