LeetCode 371. Sum of Two Integers

Calculate the sum of two integers a and b, but you are not allowed to use the operator + and -.

Example:

Given a = 1 and b = 2, return 3.

分析:不使用“+”“-”等符号来进行加法运算。一般情况下是可以用位运算来解决。

先来看一位二进制加法

1 + 1 = 10

1 + 0 = 01

0 + 1 = 01

0 + 0 = 00

结果的个位和进位分别为两个加数异或和与的关系,即:

个位:

1 ^ 1 = 0

1 ^ 0 = 1

0 ^ 1 = 1

0 ^ 0 = 0

进位:

1 & 1 = 1;

1 & 0 = 0;

0 & 1 = 0;

0 & 0 = 0;

进位需要左移来表示。也即:

加数异或 + (加数与 << 1)= 结果。

上述加法继续重复之前的位运算,当进位为0时,异或的结果就为最终的加法结果。

对于两位数的加法,比如

01 + 11 = 100

异或:01 ^ 11 = 10

进位:01 & 11 = 01

异或 + (加数与 << 1)= 10 + 010 = 100

再次异或:10 ^ 10 = 00

进位: 10 & 10 = 10

异或 + (加数与 << 1)= 00 + 100 = 100

再次异或:00 ^ 100 = 100

进位: 00 & 100 = 000

异或 + (加数与 << 1)= 100 + 000 = 100

此时进位为0, 则使用位运算即得到加法运算结果。

代码:

public class Solution {
    public int getSum(int a, int b) {
        int unit = a ^ b;
        int carry_bit = a & b;
        while(carry_bit != 0) {
            int temp_a = unit;
            int temp_b = carry_bit << 1;
            unit = temp_a ^ temp_b;
            carry_bit = temp_a & temp_b;
        }
        return unit;
    }
}




你可能感兴趣的:(LeetCode)