题目
编写一个方法,找出两个数字a
和b
中最大的那一个。不得使用if-else或其他比较运算符。
示例:
输入: a = 1, b = 2 输出: 2
思路
- 对1、0相互取反可以通过
k ^ 1
实现 - 通过构造公式
a * k + b * (k ^ 1)
来选择返回a还是b。当k取0的时候返回b,k取1的时候返回a - 先不考虑溢出,当a>b的时候,a-b符号为正数,否则相反。因此可以通过a-b的符号位来构建k。a-b是正数的时候,a大,要求k=1;a-b是负数的时候,b大,要求k=0。因此
k = (a-b) >>> (bitlen - 1) ^ 1
- 考虑溢出,同号相减不会溢出,异号相减会导致溢出。在异号的情况下,找到a、b中的那个正数就是答案。其实只要判断a是否是正数就可以选择答案,即
k = asign ^ 1
- 最终逻辑
- 判断a、b同号异号
- 同号取
k = (a-b) >>> (bitlen - 1) ^ 1
,异号取k = asign ^ 1
- 利用k选择a、b之一进行输出
代码
|
|