不使用加法运算符实现加法--LintCode领扣编程题

    public static int add(int a, int b) {
		int sum = a^b;
		int carry = (a & b) << 1;
		if(carry == 0) {
			return sum;
		}
		return add(sum,carry);
	}

原理:主要使用按位运算符中的异或运算符^和与运算符&

  • ^:相同为0,相异为1;
  • &:同是1 才为1,其他都为0,和逻辑与类似,可以把1看作true;

二进制的加法运算,和异或操作非常相似,以4位为例

加法 异或
0110 0110
0101 0101
1011 0011

从上可以看到,加法操作和异或的区别就在于进位,加法会进位,而异或没有,那么异或操作后,加上进位数不就可实现加法计算
怎么求进位数?
怎么识别出哪些位置发生了进位呢?当同为1时,会发生进位,不同为1则不会发生进位,这不正是&按位与嘛

加法
0110 0110
0101 0101
1011 0100

到此,我们只要把按位与后的结果向左移动<<1位,就能得到进位数,和异或结果求和即可

你可能感兴趣的:(LintCode)