经典面试题---求两个数字的较大值的另类解法

题目要求:

有两个变量a 和 b , 不使用 “if” ,"switch" , "? :"  或者其他判断语句 ,找出两个数中较大的。


方案一:

 int max = ( a+b  + abs(a-b) ) / 2 ;  //abs是绝对值函数

解析:

如果a>b,那么a-b>0,所以表达式就变成了(a+b+a-b)/2=(a+a)/2=a。
如果a<b,那么a-b<0,取绝对值变成-(a-b),所以表达式变成了(a+b-a+b)/2=(b+b)/2=b。


方案二:

int c = a- b ; 

c= unsigned (c) >>( sizeof(int)*8 - 1) ;  // c的二进制最高位为1 则b大 , 为0则a大


解析:

从后面的移位可以看出, c是a-b的值 ,

 若c<0 则c的符号位为1     

 若 c >0 则符号位 为0


这也是我在看书 的时候,觉得很经典的做法 , 记录下来。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值