[NowCoder]无判断max

请编写一个方法,找出两个数字中最大的那个。条件是不得使用if-else等比较和判断运算符。给定两个int ab,请返回较大的一个数。若两数相同则返回任意一个。

 

import java.util.*;

public class Max {
    public int getMax(int a, int b) 
    {
        return (a + b + Math.abs(a - b)) / 2;
    }
}
import java.util.*;

public class Max {
    public int getMax(int a, int b) 
    {
        int r = a - b;
        r = r >> 31;
        
        return a + r*(a - b);
    }
}

思路1:

a和b的差的绝对值是abs(a - b),然后差的绝对值加上a和b的和即为最大值的两倍。同理求两数较小的一个,a + b - abs(a - b)即可。

思路2:

 c = (a-b)>>31

  (1)当a>=b时,(a-b)符号位为0,(a-b)右移31位,高位补0,右移后的结果为0;

  (2)当a<b时,(a-b)符号位为1,(a-b)右移31位,高位补1,故右移后的结果不是 我们想当然的1,而是-1。 

a+c*(a-b)

  (1)当c=0时,说明a>=b,a+c*(a-b)=a,返回a;
  (2)当c=-1时,说明a<b,a+c*(a-b)=a-(a-b)=b,返回b。

转载于:https://www.cnblogs.com/limeina/p/6684486.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值