给出两个整数 aa 和 bb , 求他们的和。
样例
样例 1:
输入: a = 1, b = 2
输出: 3
样例解释: 返回a+b的结果.
样例 2:
输入: a = -1, b = 1
输出: 0
样例解释: 返回a+b的结果.
挑战
显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)
说明
a和b都是 32位
整数么?
- 是的
我可以使用位运算符么?
- 当然可以
注意事项
你不需要从输入流读入数据,只需要根据aplusb
的两个参数a和b,计算他们的和并返回就行。
js语言
/**
* @param a: An integer
* @param b: An integer
* @return: The sum of a and b
*/
const aplusb = function (a, b) {
// write your code here
//return a+b;
if(b===0){
return a;
}
if(a===0){
return b;
}
var sum = a^b;
var carry =(a&b)<<1;
return aplusb(sum,carry);
}
分析:使用位运算进行加法运算。摘自https://www.cnblogs.com/houjun/p/4908725.html
对于二进制的加法运算,若不考虑进位,则1+1=0,1+0=1,0+1=1,0+0=0,通过对比异或,不难发现,此方法与异或运算类似。因而排出进位,加法可用异或来实现。然后考虑进位,0+0进位为0,1+0进位为1,0+1进位为0,1+1进位为1,该操作与位运算的&操作相似。
那么加法运算可以这样实现:
1)先不考虑进位,按位计算各位累加(用异或实现),得到值a;
2)然后在考虑进位,并将进位的值左移,得值b,若b为0,则a就是加法运算的结果,若b不为0,则a+b即得结果(递归调用该函数)。
注意:js中判断等于有"=="和"===",在这进行下区分:
== 两边值类型不同的时候,要先进行类型转换,再比较。
=== 不做类型转换,类型不同的一定不等。
java语言
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) {
// write your code here
//return a+b;
if(b==0){
return a;
}
if(a==0){
return b;
}
int sum = a^b;
int carry =(a&b)<<1;
return aplusb(sum,carry);
}
}
分析:同上。