[LintCode] A + B Problem(位运算)

本文介绍了一种不使用常规算术运算符实现两个整数相加的方法。通过位运算中的异或(^)来求和,与(&)运算来确定是否进位,并递归地进行直到没有进位发生。此外还简要提到了位运算在减法和乘法中的应用。

Problem

Write a function that add two numbers A and B. You should not use + or any arithmetic operators.

Example

Given a=1 and b=2 return 3

Challenge

Of course you can just return a + b to get accepted. But Can you challenge not do it like that?

Note

**位运算笔记
Bit Manipulation Notes:**

加法:

  1. ^异或运算:求和;

  2. &与运算:进位。

减法:

  1. 将负数化为正:~i, +1,两步完成取反

  2. 做加法

乘法:

  1. a * b: if (b & 1) ans += a //b的最后一位是1,则结果+a

  2. 每次循环后a << 1, b >> 1; //b始终判断最后一位,a进位累加(小学生算式做乘法)

除法:(不赘述,O(log n))

http://blog.youkuaiyun.com/ojshilu/article/details/11179911

Solution

class Solution {
    public int aplusb(int a, int b) {
        // write your code here, try to do it without arithmetic operators.
        if (b == 0) return a;
        int sum = a^b;
        int carry = (a&b) << 1;
        return aplusb(sum, carry);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值