面试题 16.07. 最大数值

1
2
3
4
5
6
7
8
9
10
11
12
13
class Solution {
public int maximum(int a, int b) {
int k = (b - a) >>> 31; // 若 a 与 b 同号且 b 大于等于 a, 则 k = 0, 若 a 与 b 同号且 b 小于 a, 则 k = 1

// 处理 a 与 b 异号时的场景,因为 a 与 b 异号时 b - a 可能溢出,如 Integer.MAX_VALUE - Integer.MIN_VALUE = -1
int aSign = a >>> 31, bSign = b >>> 31; // 注意使用无符号右移,我们只需要最高的符号位
int signDiff = aSign ^ bSign; // 同号则 signDiff 为 0, 异号则 signDiff 为 1
// 同号时 k 有效,此时保留 k, 异号时 k 是无效的,需要重新计算 k
k = k & (signDiff ^ 1) | (bSign & signDiff); // bSign & signDiff 的作用是:当异号时,若 b 为负数,则使 k 为 1, 若 b 为正数,则使 k 为 0

return a * k + b * (k ^ 1); // 根据 k 的值决定保留 a 与 b 中的哪一个
}
}

References

面试题 16.07. 最大数值