编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。
小问号你是否有很多小朋友?这种类型的题,十有八九都离不开位运算,所以方向确立下来了,我们再来观察一下a和b的特征,小学数学老师告诉我小的数减去大的数结果必定为负数,那么负数在计算机中也是有一定特征的,符号位为1,所以我们可以利用这个符号位来干点骚操作。
小学数学老师还告诉我:1×x=x。所以我们可以构造一个公式:**a×k+b×(k^1)**这个K自然就是a-b结果的符号位啦。当然,我们还要考虑溢出的情况,最好把int转为long进行运算。
代码如下:
class Solution {
public int maximum(int a, int b) {
int k=(int)(((long)a-(long)b)>>>63);
return a*(k^1)+b*k;
}
}