LeeCode371 位运算之 “与”运算 + “异或”运算

题目:

不使用运算符 + 和 - ​​​​​​​,计算两整数 ​​​​​​​a 、b ​​​​​​​之和。

示例 1:
输入: a = 1, b = 2
输出: 3

示例 2:
输入: a = -2, b = 3
输出: 1

这里需要运用的位运算就是 & 和 ^
举例说明

a = 5 = 0101
b = 4 = 0100
^运算的计算法则是“相同为0,不同为1”
res1 = a ^ b = 0001 本来应该是9,但是与运算结果是1;
这里就是所谓的无进位运算 因为9 = 1001 是在原来的第三位进了“1”到第四位,相当于与运算的结果没有进行进位操作。

如何进位呢:

我们需要先找到进位的位置所在
&运算的计算法则是“同为1,则为1,否则为0”

  1. 进位的位置,很好理解,就是对应位都是1的时候就需要进位,这个位置自然就是进位的位置。
    那么“与”运算很好的契合
  2. 找到进位位置之后,我们需要将这里的“1”往左移动一位,也就是进位操作了

res2 = (a & b) << 1 = 1000 先进行“与”运算,将结果只保留需要进位的前一个数字, 再左移1位(进位操作)
这个时候再将两个结果进行“无进位加法”— ^运算,就会得到结果了
res = res1 ^ res2

算法可能会运行多次,因为可能需要多次进位操作
那么算法的终止条件呢,先分析一下不需要进位时的加法
如果不需要进位的时候 执行一下“&”运算:
0000 &
0001
结果为:
0000
说明只要不再需要进位的时候,两个数的与操作结果必为0;

所以就可以写出代码了

        public int getSum(int a, int b) {
        int res = a ^ b;
        int carry = (a & b) << 1;
        while(carry != 0)
        {
            int temp = (res & carry) << 1;
            res ^= carry;
            carry = temp;
        }
        return res;
    }

你可能感兴趣的:(java)