编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。
示例:
输入: a = 1, b = 2
输出: 2
int maximum(int a, int b){
long k=((long)a-(long)b)>>63;
return a*(!k)+b*abs(k);
}
类型范围的向右移位相应位数可以得到符号位,int型移位31位,long型移位63位
符号位上,如果为正数,那么符号位为0,如果为负数,符号位为-1
因为测试用例会超过int的范围,所以强制转换成long型
如果不让用abs()函数的话,可以改成
return a*(1+k)+b*!(1+k);
另外还可以用数学方法:
还有一种间接取符号位的方法是
int sign = (((long)a-(long)b)/fabs((long)a-(long)b));
其取值为1(a>b)和-1(a<b),将sign值加1,可以转换为2和0,然后取巧用判别方法switch或者while之类的能够返回。