有趣的算法--A+B

A+B问题的位运算解法

有趣的算法--A+B

1. A + B 问题

给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
- a和b都是 32位 整数
- 可以使用位运算符
复制代码

样例:如果 a=1 并且 b=2,返回3

当不能使用 + 等数学运算符的时候,我们自然而然就会想起使用位运算符(并且题目也给出了提示)

如何表示二进制的加法?

二进制的加法就是: 0+1=1 0+0=0 1+1=0(有进位)

忽视进位的情况下就是一个 “异或运算”

而进位的判断其实也蛮简单的,我们只需要判断哪个位置是 1+1 就行了, 而这个可以通过 “与运算” 来判断

  • TIPs1:此处应该循环判断是否需要进位

  • TIPs2:考虑负数的情况时,我们将负数变为补码---取反加一,此处的加法操作需要调用自定义的加法函数

    答案
    
    public class Solution {
    
        /**
    
        * @param a: An integer
    
        * @param b: An integer
    
        * @return: The sum of a and b
    
        */
        public int aplusb(int a, int b) {
    
            if(a >> 31 == -1) {
    
                aplusb(~a,1);
    
            }
    
            if(b >> 31 == -1){
    
                aplusb(~b,1);
    
            }
    
            while(b!=0){
    
                int sum;
    
                sum = a ^ b;
    
                b = (a & b) << 1;
    
                a = sum;
    
            }
    
            return a;
    
        }
    
    }
    复制代码

转载于:https://juejin.im/post/5ae67786f265da0b83368535

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值