不用判断语句比较两个数字大小


如题,网上有很多解决方案,在这里,罗列一下,留作后看。

1、平均值求法

 1 //将取两个数的差的绝对值加上两个数,那么得到的就是大的那个数的两倍,这样除以二就得到了大的那个值
 2 
 3 int getmax(int a, int b)
 4 {
 5     return (a + b + abs(a - b)) / 2;
 6 }
 7 
 8 //同样,减去两数的和减去两倍差的绝对值, 再除以二,就得到小的那个数:
 9 
10 int getmin(int a, int b)
11 {
12     return (a + b - abs(a - b) * 2) / 2;
13 }

2、移位法

 1 //将两个数的差进行移位,向右移31位,如果得到的值为1,那么被减数大,反之减数大,当然得到大小值就有两种方法,一种是数组,一种是switch返回:
 2 //为什么移31位,数字如果是负数,那么是以补码的形式存储的,右移之后得到的就是最高位的值,如果是1,那么说明这个差是负数,如果是0,那么这个差是正数
 3 //以下是用数组
 4 int getmax(int a, int b)
 5 {
 6     int buff[2] = { a, b };
 7     unsigned int z = a - b;
 8     z = z >> 31;
 9     return buf[z];
10 }
11 
12 int getmin(int a, int b)
13 {
14         int buff[2] = { a, b };
15     unsigned int z = a - b;
16     z = z >> 31;
17     return buf[abs(z - 1)];
18 }    
19 
20 
21 //一下是用switch判断来返回(当然,如果允许用switch的话)
22 int getmax(int a, int b)
23 {
24         int buff[2] = { a, b };
25     unsigned int z = a - b;
26     z = z >> 31;
27     switch (z)
28     {
29     case 0:
30         return a;
31         break;
32     case 1:
33         return b;
34         break;
35     }
36 }

移位法得到结果也有好几种,将差和1进行&操作,也能得到一个结果。

 

细节处见真章啊!

智能推荐

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
© 2014-2019 ITdaan.com 粤ICP备14056181号  

赞助商广告