1、加法:
两个整数的加法可以转换成:两个整数各自2进制位的纯加法和s【不包括进位】,记录两个整数在哪一位上有进位的变量carry。然后结果就转化为了 s+carry。接着,再使用相同的方式,直到carry为0为止。此时,相当于被加数为0,和就是加数本身。
递归方式:
1 // 使用位运算计算两个数的加法2 int sum(int a, int b)3 {4 if (b == 0) return a;5 int s = a ^ b;6 int carry = (a & b) << 1; // 如果两个数对应的位都是1,说明该位有一个进位7 // 此时的和即为 sum + carry8 return sum(s, carry);9 }
非递归方式:
1 int _sum(int a, int b) 2 { 3 int s = a ^ b; 4 int carry = (a & b) << 1; // 如果两个数对应的位都是1,说明该位有一个进位 5 while (carry != 0) 6 { 7 a = s; 8 b = carry; 9 s = a ^ b;10 carry = (a & b) << 1;11 }12 13 return s;14 }