搜尋此網誌

[C/C++][找出最大最小值]

在C語言中,要比較兩個數值誰大誰小應該是非常簡單的

1. 用 if 判斷式與大於、小於,這應該是最直接也是最容易想到的方法

2. 用三元運算子,其實也是一樣意思,只是看起來比較簡潔
(a<b)?a:b

3. bitwise 運算,這是本篇文章主要要討論的

首先我們要先知道,在 bitwise 運算下,兩數值可不必透過第三個數值做交換的動作,詳細請看以前的文章:[C/C++][不透過第三個變數做兩數值交換],既然可透過 bitwise 運算交換兩數值,那接下來就要做判斷了

#include <iostream>

using namespace std;

int main () {

    int a = 1;
    int b = 2;

    cout << (b^((a^b) & (-(a<b)))) << endl;    // min(a, b)

    return 0;
}

在上述程式碼中,有個特別的地方,就是 -(a<b),比方說當 a=1, b=2 時,-(a<b) 就會是 -1,轉換成二進制來看的話就是全部都是 1,跟 (a^b) 做 AND operation 後還是 (a^b),套用上述的"不透過第三個變數做兩數值交換"的結果可知,(b^((a^b) & (-(a<b)))) = (b^(a^b)) = a;那如果 a=2, b=1 時,-(a<b) 就會是 0,跟 (a^b) 做 AND operation 後還是 0,(b^((a^b) & (-(a<b)))) = (b^0) = b,即是找出較小的值

那如果要找最大值呢?很簡單,只要改最前面的 b 就好了,如下

#include <iostream>

using namespace std;

int main () {

    int a = 1;
    int b = 2;

    cout << (a^((a^b) & (-(a<b)))) << endl;    // max(a, b)

    return 0;
}

沒有留言:

張貼留言