程序员面试金典-面试题 16.07. 最大数值
题目:
编写一个方法,找出两个数字a
和b
中最大的那一个。不得使用if-else或其他比较运算符。
示例:
输入: a = 1, b = 2 输出: 2
分析:
利用两数的和加上两数差的绝对值除以2得到较大的数。
不过Math.abs()中判断了数字大于还是小于0;
这里有一个利用位运算求解绝对值的方法。
以-3为例(var ^ (var >> 7)) - (var >> 7)
-3>>7 = 0xFF,而-3^0xFF相当于取反码,-0xFF相当于+1.最后结果得3,实际上-3的补码就是通过3取反加1得来的。
程序:
class Solution { public int maximum(int a, int b) { long sum = (long)a + (long)b; long diff =(long)a - (long)b; diff = (diff ^ (diff >> 63)) - (diff >> 63); return (int)((sum + diff) / 2); } }