看到這個題目,我的腦中真的是
正文:
我們通常怎麼比較兩個數的大小呢?
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 這是個好方法,不過題目說了...