【題目】面試題 16.07. 最大數值
編寫一個方法,找出兩個數字a和b中最大的那一個。不得使用if-else或其他比較運算符。
示例:
輸入: a = 1, b = 2
輸出: 2
【解題思路1】位運算實現絕對值功能
本質是平均值法: max(a, b) = ((a + b) + abs(a - b)) / 2
class Solution {
public int maximum(int a, int b) {
long sum = (long)a + (long)b;
long diff = (long)a - (long)b;
long abs_diff = (diff ^ (diff >> 63)) - (diff >> 63);
long res = (sum + abs_diff) / 2;
return (int)res;
}
}
【解題思路2】計算a-b的符號
正數最高爲0,負數最高爲1。排除a-b超Integer範圍情況,強轉long
class Solution {
public int maximum(int a, int b) {
int i = (int) (((long) a - (long) b) >>> 63);
return (i ^ 1) * a + i * b;
}
}
class Solution {
public int maximum(int a, int b) {
// 先考慮沒有溢出時的情況,計算 b - a 的最高位,依照題目所給提示 k = 1 時 a > b,即 b - a 爲負
int k = b - a >>> 31;
// 再考慮 a b 異號的情況,此時無腦選是正號的數字
int aSign = a >>> 31, bSign = b >>> 31;
// diff = 0 時同號,diff = 1 時異號
int diff = aSign ^ bSign;
// 在異號,即 diff = 1 時,使之前算出的 k 無效,只考慮兩個數字的正負關係
k = k & (diff ^ 1) | bSign & diff;
return a * k + b * (k ^ 1);
}
}