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;
    }
}




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值