不用比较运算符,判断int型的a,b两数的大小

看到一个人的帖子,想了一下,然户发了一个帖子。原帖见:看到一个面试题,大家来讨论下!

其实出现问题的情况,只存在于异号两数想减使得结果超过了int型的最大或最小值,因此导致了符号位丢失。所以在这个基础上想到了转型。就是把int型转成long型的,那么符号位就保存在了第64位上了,同时也不会丢失符号位。贴代码(借鉴了一个网友的方法,用数组来存结果,这样就不用==比较符了。这个方法在Core Java中经常用到。):

public class Bigger { public static void main(String args[]){ int a = -2147483648; int b = 2147483647; String[] strArray = {"a>=b", "a<b"}; int i = (int)((long)a-(long)b >>> 63); System.out.println(strArray[i]); } }

当然了,思考都是有过程的。开始时,最先想到的是两数想减,看符号位。我想大家也都会想到这一点:

System.out.println(((a-b)>>>31==0)?"a>=b":"a<b");

用了==先不说,一般情况下都能得出正确的结果;但是先上面代码那样a是int型的最小值,而b是int型的最大值的话,就会有越界。因此,在这个代码的基础上,增加限制(符号相同,就减,这样安全,没有问题;符号相反的话,如果a是正的,直接得出结果。):

System.out.println((((a >>> 31 == 0) && (b >>> 31 == 1))|(((a >>> 31)^(b >>> 31))==0)&&(((a-b)>>>31)==0))?"a>=b":"a<b");

当然了,怎么看还是第一段代码简洁。思考无极限,是不是还有别的解法呢?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值