C++
思路:不使用加减乘除,那么考虑到C中的运算符,除了算术运算外,还有

关系运算符: ==,!=,>,<,>=,<=
逻辑运算符: 与&&、或||、非!
位运算符: 按位与&、按位或!,按位异或^,取反~,左移一位右边补零<<,右移一位左边补零>>赋值运算符: =,+=,-=,*=,/=,%=,<<=,>>=,&=,|=,^=
杂项运算符: 返回变量大小sizeof,条件运算符Condition?X:Y,强制转换运算符Cast,指针运算符&,指针运算符*,成员运算符.和->(用于引用类、结构和共用体的成员),逗号运算符 ,

结合上述运算符,我们可以想到在二进制中的加减运算其实就是与或等一系列的运算,即位运算。
按位异或相当于 没有进位 的加法
按位与并且左移一位相当于 进位
于是二者结合,直到 进位 处的数值为0(即不再进位),停止循环。

我们定义一个临时变量temp,用于存放两数的按位异或的结果,定义另一个临时变量temp2,用于存放两数按位与并左移一位的结果,如果temp2中不为0,说明还有进位,那么需要temp和temp2的内容再次按位异或、按位与并左移,直到temp2中结果为0,表示没有进位,即temp中结果为二者和。但是在编写程序的时候只需要一个temp记录异或结果,按位与并左移一位的结果可以赋给num2,然后temp的结果再赋给num1,形成循环,以num2的值作为循环判断条件。
代码如下

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