面试题 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;
}
}