1.A+B问题(位运算)-LintCode


1. A+B问题(位运算)

题目来源:LintCode

题目:
给出两个整数a和b, 求他们的和, 但不能使用 + 等数学运算符。
你不需要从输入流读入数据,只需要根据apsulb的两个参数a和b,计算他们的和并返回就行。

a和b都是 32位 整数, 可以使用位运算符.


样例
如果 a=1 并且 b=2,返回3
难度级别:中

使用的编程语言:
C++

思路分析:

根据题意, 不能用'+'等数学运算符, 我马上想到用位操作来实现加法的功能.

C++有如下几个为操作符:

~:按位求反

<<:左移运算符

>>:右移运算符

&:按位与

^:按位异或

|:按位或


我的思路是这样的:

0+0=0

1+0=1;

1+1=0;

0+1=1;

在不考虑进位的情况下, 对每个位的相加可以通过 ^ 运算符(按位异或)来完成.

假设有两个给定的数 a和b.

1.先考虑不进位的情况: a^b

接下来考虑进位:(1表示进位)

1+1 = 1;

1+0 = 0;

0+0 = 0;

0+1 = 0;

不难发现, 对每个位的相加进位与否可以通过 & 运算符(按位与)来完成.

由于要进一位, 所以需要左移一位, 即可得:

2.考虑进位的情况: (a&b)<<1;


最终结果 = 不进位的情况 + 进位时的情况.

实现代码:
class Solution {
public:
    /**
     * @param a: An integer
     * @param b: An integer
     * @return: The sum of a and b
     */
    int aplusb(int a, int b) {
         return (a^b)+((a&b)<<1);
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值