代码实现:
思路:位运算,利用了异或和与的特性,异或操作与加操作的区别在于异或操作在二进制状态下两个数同1不进位,只是置为0,其他均相同,那么使用与运算计算进位值,补齐异或操作的缺点即可,与运算中只有两个数二进制位同1才置为1,所以只要两个数相与,二进制数为1的地方就是需要进位的地方,再左移一位,得到的值就是异或操作模拟加和操作时需要的进位数,将其和结果异或,不断重复上述操作直到进位值为0返回结果
/* 位运算,利用了异或和与的特性,异或操作与加和操作的区别在于异或操作在 二进制状态下两个数同1不进位,只是置为0,其他均相同,那么使用与运算计算进 位值,补齐异或操作的缺点即可,与运算中只有两个数二进制位同1才置为1,所以 只要两个数相与,二进制数为1的地方就是需要进位的地方,再左移一位,得到的值 就是异或操作模拟加和操作时需要的进位数,将其和结果异或,不断重复上述操作 直到进位值为0返回结果 */ int add(int a, int b) { while (b != 0) { /* 特别注意,由于题目中提到了可能为负数,int型的第32位为符号位, 如果负数与操作后左移,会导致溢出,所以要将与运算结果先转换为无符号, 再进行左移操作 */ int sum = (a ^ b); int carry = (unsigned int)(a & b) << 1; a = sum; b = carry; } return a; }