面试题 16.07. 最大数值

面试题 16.07. 最大数值 #

题目 #

  • 编写一个方法,找出两个数字ab中最大的那一个。
  • 不得使用if-else或其他比较运算符。

思路 #

位运算 #

  • 如果a > b,则k1,否则为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;
    }
}

致谢 #

Ripple