面试题 16.07. 最大数值 #
题目 #
- 编写一个方法,找出两个数字
a
和b
中最大的那一个。 - 不得使用
if-else
或其他比较运算符。
思路 #
位运算 #
- 如果
a > b
,则k
为1
,否则为0
。如果给定k
,你能返回最大值吗(没有比较或if-else
逻辑)? - 如果当
a > b
时,k
等于1
,那么当k
等于0
时则相反,然后你可以返回a*k + b*(1-k)
。但你如何创建k
? - 当
a > b
时,a – b > 0
。你能得到a – b
的符号位吗? - 你考虑过如何处理
a – b
中的整数溢出吗?
代码 #
位运算 #
class Solution {
public int maximum(int a, int b) {
long res = (long)a - (long)b;
long sign = (res >> 63) & 1;
/** 若sign==1, 则a<b 否则 a >= b */
return (int)(1-sign) * a + (int)sign * b;
}
}