开始在LintCode上面做算法练习,第一道题就是A+B的问题,上去第一次反应这也太简单了,直接a+b就完事了呗,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)
https://www.lintcode.com/problem/a-b-problem/description
LintCode之A+B网站链接
下面记录一下自己写的代码
public int aplusb(int a, int b) {
int sum=(a^b)+((a&b)<<1);
return sum;
}
下面简单讲解一下这种写法,运用了位运算
首先传入了两个参数,a和b
(a^b)算的不进位的值
比如a=2,b=3 转成2进制变成
a=0000 0010
^(异或运算)
b=0000 0011
a^b=0000 0001=1
(a&b)<<1算的是进位的值
a&b=0000 0010
&(与运算)
0000 0011
=0000 0010 = 2
<<1
=0000 0010 = 4
因为上面的a&b是计算进位的值,只显示当前哪一位需要向前进1,所以还需要<<1 当前需要进位的向左移动移1位就变成了进位之后的值。
进位的值和不进位的值相加就是A+B的值