16.07.最大数值

题目

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

示例:

输入: a = 1, b = 2 输出: 2

思路

  1. 对1、0相互取反可以通过 k ^ 1实现
  2. 通过构造公式a * k + b * (k ^ 1) 来选择返回a还是b。当k取0的时候返回b,k取1的时候返回a
  3. 先不考虑溢出,当a>b的时候,a-b符号为正数,否则相反。因此可以通过a-b的符号位来构建k。a-b是正数的时候,a大,要求k=1;a-b是负数的时候,b大,要求k=0。因此k = (a-b) >>> (bitlen - 1) ^ 1
  4. 考虑溢出,同号相减不会溢出,异号相减会导致溢出。在异号的情况下,找到a、b中的那个正数就是答案。其实只要判断a是否是正数就可以选择答案,即k = asign ^ 1
  5. 最终逻辑
    1. 判断a、b同号异号
    2. 同号取k = (a-b) >>> (bitlen - 1) ^ 1,异号取k = asign ^ 1
    3. 利用k选择a、b之一进行输出

代码

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
public int maximum(int a, int b) {  
    int bitlen = 32;  
    int asign = a >>> (bitlen - 1);  
    int bsign = b >>> (bitlen - 1);  
    //同号为1,异号为0  
    int isSameSign = asign ^ bsign ^ 1;  
    int k = isSameSign * ((a - b) >>> (bitlen - 1) ^ 1)  
            + (isSameSign ^ 1) * (asign ^ 1);  
    return a * k + b * (k ^ 1);  
}
Built with Hugo
主题 StackJimmy 设计