题目:
解法:
/*
* 位运算
*
* 因为不能使用加减乘除四则运算,所以只能想到使用二进制的位运算实现相加操作。
* 二进制位运算中,异或操作: 1^1=0 0^0=0 1^0=1 0^1=1,可以模拟无进位的加操作;
* 与操作:1&1=1 0&1=0 1&0=0 0&0=0,可以模拟进位的情况,再将与后的值左移一位即等于进位值。
*
* 普通的十进制数相加过程是:
* 1) 各位相加,无进位和 2) 计算进位值 3) 无进位和加上进位值
*
* 使用位运算的二进制数的相加过程相同:
* 1) 两个二进制数各位异或,得到无进位的和 2) 二进制数各位与再左移,计算进位 3) 无进位和与进位异或
* 重复上面操作,直到不再有进位,即进位为0。
*
* 相关问题:
* 不使用新的变量,交换两个变量的值。比如有两个变量a、b,希望交换它们的值。有两种不同的操作:
* 1. 基于加减法 -- a = a + b; b = a - b; a = a - b;
* 2. 基于位运算 -- a = a ^ b; b = a ^ b; a = a ^ b;
* */
1 class Solution { 2 public: 3 int add(int a, int b) 4 { 5 // 无进位和、进位值 6 int sum, carry; 7 while (b != 0) 8 { 9 // 异或操作得无进位和 10 sum = a ^ b; 11 // 与操作后移位得进位值 12 carry = ((unsigned int) (a & b) << 1); 13 14 // 循环,直到进位为0 15 a = sum; 16 b = carry; 17 } 18 19 return a; 20 } 21 22 };
原文:https://www.cnblogs.com/ocpc/p/12860516.html