来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/sum-of-two-integers
题目描述:
给你两个整数 a 和 b ,不使用 运算符 + 和 - ,计算并返回两整数之和。
示例 1:
输入:a = 1, b = 2
输出:3
示例 2:
输入:a = 2, b = 3
输出:5
思路:
使用位运算,从第1位开始构建结果的二进制.
- 如果a和b二进制的第i位都为1,代表结果result的第i位是0还是1,由进位carry决定。
-- carry为0,result的第i位为0
-- carry为1,result的第i位为1
-- 设置carry = 1 - 如果a和b二进制的第i位其中一个为1,代表结果result的第i位是0还是1,由进位carry决定。
-- carry为0,result的第i位为1
-- carry为1,result的第i位为0,且需要进位,carry = 1 - 如果a和b二进制的第i位都为0,代表结果result的第i位是0还是1,由进位carry决定。
-- carry为0,result的第i位为0
-- carry为1,result的第i位为1,且需要重制carry = 0 
代码实现:
class Solution {
    public int result = 0;
    public int carry = 0;
    public int getSum(int a, int b) {
        for (int i = 0; i < 32; i++) {
            // 获取a二进制的第i位
            int ai = (a >> i) & 1;
            // 获取b二进制的第i位
            int bi = (b >> i) & 1;
            if (ai == 1 && bi == 1) {
                // 如果都等于1,代表需要进位.
                result |= (carry << i);
                carry = 1;
            } else if (ai == 1 || bi == 1) {
                // 进位为0,则第i位为1,反之则为0.
                result |= ((1 ^ carry) << i); 
            } else {
                result |= (carry << i);
                carry = 0;
            }
        }
        return result;
    }
}