不用判斷語句比較兩個數字大小


如題,網上有很多解決方案,在這里,羅列一下,留作后看。

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進行&操作,也能得到一個結果。

 

細節處見真章啊!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM