不用比較找出兩個數比較大的數

2021-10-05 10:16:35 字數 1718 閱讀 2847

看到這個題目,我的腦中真的是

正文:

我們通常怎麼比較兩個數的大小呢?

c=a-b      若c<0則a>b

若c>0 則a若c=0則a=b

那怎麼用c語言表示呢?

我們知道32位整數中有乙個位元位為符號標誌位,正數為0,負數為1。

即判斷c的標誌位,我們就可以知道a大還是b大

int symbol(int num)

那麼我們的主體函式可以寫為

int getmax(int a,int b)

主要思路:通過判斷c的符號,推斷出誰大誰小。為了簡便,在這將  int sb=sa>0?0:1;這句**的功能封裝乙個函式。

int  flip(int x)

所以我們要對**進行進一步的完善:

int getmax(int a,int b)

可能看了上面的**,我們對後面幾行又有了些許的迷惑。不過,沒關係。我們在來分析一波。我們先將最後三行合併成一行**:

完善後的**

(difsab*sa+samsab*sc)*a+flip(difsab*sa+samsab*sc)*b

之前的sa*a+sb*b;

在這裡,我們無非有兩種情況一、a和b符號相同,我們可以通過判斷c的符號得出結果二、a和b符號不同,符號位為1的就是我們想要的結果那麼返回值也就一句這兩種情況設定

第一種:符號相同,c的符號有用保留;此時difsab=0,samsab=1;

(difsab*sa+samsab*sc)*a+flip(difsab*sa+samsab*sc)*b

等價於 sc*a+flip(sc)*b

第二種:符號不同,c的符號沒有用處;此時difsab=1;samsab=0

(difsab*sa+samsab*sc)*a+flip(difsab*sa+samsab*sc)*b

等價於 sa*a+flip(sa)* b

a=  2,147,483,647;b= - 1;

在這種情況下,我們期待c的符號為正;而是實際中,因為a代表有符號int最大值,再加1之後會變為整形最小值即

- 2,147,483,648,所以我們得到c的符號位負,而非正

關於這個溢位問題,可以參考部落格

不用任何比較判斷找出兩個數中較大的數

題目 給定兩個32位整數a和b,返回a和b中較大的。要求 不用任何比較判斷。將判斷轉換位運算實現 sign獲取符號位,flip翻轉符號位 判斷a b的符號位 符號位為0表示為正,符號位為1表示為負 為正返回a,為負返回b 因此same flip sign a b a sign a b b返回同號兩者...

不用if比較兩個數大小

一 問題 有兩個變數a,b,不用 if switch或者其它判斷語句,找出兩個數中間比較大的 二 解決方案 方法1 取平均值法 大的為 a b abs a b 2 小的為 a b abs a b 2 int fmax1 int a,int b 方法2 不使用abs ab時,b a 0,所以前面為a ...

不用if比較兩個數大小

大的為 a b abs a b 2 小的為 a b abs a b 2 int fmax1 int a,int b ab時,b a 0,所以前面為a a b 後面為a b,那麼結果就是a int fmax2 int a,int b 如果取 a b 餘數不為0,則說明a b 這是個好方法,不過題目說了...