title: 算法小练——A + B 问题
categories:
- Algorithms
tags: - esay
abbrlink: 115354012
date: 2019-11-02 12:47:29
描述
给出两个整数 aa 和 bb , 求他们的和。
你不需要从输入流读入数据,只需要根据aplusb
的两个参数a和b,计算他们的和并返回就行。
您在真实的面试中是否遇到过这个题? 是
题目纠错
说明
a和b都是 32位
整数么?
- 是的
我可以使用位运算符么?
- 当然可以
样例
样例 1:
输入: a = 1, b = 2
输出: 3
样例解释: 返回a+b的结果.
样例 2:
输入: a = -1, b = 1
输出: 0
样例解释: 返回a+b的结果.
挑战
显然你可以直接 return a + b,但是你是否可以挑战一下不这样做?(不使用++等算数运算符)
代码
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 he
return a+b;
}
}
这道题目前为止,都很简单。但是如果你关注到了挑战的话,就引出思考的问题了。
对于作者这种初次接触算法的新手来说,对于不使用算术运算符的思路完全没有,于是便查询了下资料,才了解到算术运算符的底层是位运算符,可以用位运算符来替代算数运算符。
那么就科普下位运算符的知识:
XOR
异或 :当 a、b 不等时,为1,反之,为0
AND
且:当 aANDb 就是 a与b 在位上的相加,需要进位
<<
:进位
eg: 5+6 => 101 +110 => 1011 => 11
那么把一个十进制数先转化为二进制数,就发现,非进位部分通过XOR来运算,进位部分通过AND来运算。因为 0和0得0 0和1为1 符合异或的规则,1和1为10 符合AND的规则。
public static int aplusb(int a, int b) {
// write your code he
return b==0?a:aplusb(a^b,(a&b)<<1);
}