面试题 16.07. 最大数值
编写一个方法,找出两个数字a和b中最大的那一个。不得使用if-else或其他比较运算符。
示例:
输入: a = 1, b = 2
输出: 2
通过次数3,781提交次数5,250
这道题的本质是用max(a,b)的原理,平均法max(a,b)=(a+b+abs(a-b))/2;
那么问题就是如何求abs
因为负数如果右移会自动在左边补1,所以如果负数移动到最大,最后这个数会变为-1
32位下
abs(a)=(a^(a>>31))-(a>>31)
class Solution {
public:
int maximum(int a, int b) {
long _sum=long(a)+long(b);
long _diff=long(a)-long(b);
long _abs_diff=(_diff^(_diff>>63))-(_diff>>63);
return (_sum+_abs_diff)/2;
}
};