C語言中不使用選擇結構和條件運算子有哪些方法可以判斷兩個整數的大小?

時間 2021-05-29 22:57:52

1樓:AKAX

leetcode經典,不用比較符和條件語句比較兩個整數大小的演算法。再進一步,不呼叫系統函式,不新建變數,不型別轉換。首發leetcode,次發知乎,後發qq。

無long無unsig無轉換無新建變數無呼叫函式適用任意位cpu通用演算法。c++/c:

class

Solution};

2樓:涇渭漳淮

int compare(int a,int b)

以上,如果a大於b將返回1,反之返回0。

你是想要這樣的嗎?

3樓:undefined

long

isLess

(longa,

longb)

先計算減法,然後取出符號位。這實際上對浮點也適用,但是浮點讀符號位要用指標強轉,比較難看。

在減法中,有符號數溢位一定是發生在正數減負數得到負數,或者負數減正數得到正數的情況,而在這兩種情況下,我們其實不需要計算溢位標誌位。先寫出真值表:

為了便於理解,這裡先寫出主析取正規化,三個值分別用x, y, z表示:(!

x&!y&

z)|(

x&!y&

z)|(

x&!y&!

z)|(

x&y&

z)這裡的主析取正規化其實可以直接用,但是還是可以適當簡化一下:(x

&!y)|

(z&((

!x&!y

)|(x

&y)|

(x&!y

)))->(x

&!y)|

(z&!

(!x&

y))->(x

&!y)|

(z&(

x|!y))

->w=!

y,(x

&w)|

(z&(

x|w))

->w=!

y,(x

+w+z

)>>1最後那個的確是比較有趣的結論

那麼:long

isLess

(longa,

longb)

順便附上溢位標誌的真值表:

計算溢位標誌之後,isLess值可以用S != O,S xor O,或者(!S & O) | (!

O &S)得出[1]。這條路線和上面的路線沒有實質性的區別,所以就不展示了。

是內聯彙編,主要是為了用adc,不用的話會比較麻煩

subq%%2

,%%2subq%%1

,%%0adcq$0,

%%2因為無符號比較是看進製標誌,所以用adc指令獲取。因為不允許用比較所以依然是用sub來代替cmp:但是眾所周知sub和cmp實際上是完全相同的指令:-)

當然有符號數也可以直接取對應的標誌位,但是有符號數沒有adc指令這麼方便的操作,所以還是直接取結果符號位比較方便。

根據isLess值計算較大值和較小值:這個其實。。。真的太簡單了不想說:

long

min(

longa,

longb)

long

max(

longa,

longb)

1: Intel 64 and IA-32 Architectures Software Developer』s Manual, Vol. 2A 3-495

溢位的思路當然要抄Jcc的現成實現了好不好

4樓:娶個敏感詞

// >

intisGreater

(intx,

inty

)// <

intisLess

(intx,

inty

)// <=

intisLessOrEqual

(intx,

inty)

5樓:「已登出」

我給你個部落格,這是個好玩的問題

6樓:蘇菲的老爸

用減法,兩個數相減。結果等於零,則兩個數相等。結果符號位(最高位)為一,則第乙個數大,否則第二個數大。

這種題沒意義,沒有這樣的應用場景。學程式語言不要鑽牛角尖,知道茴香豆的茴有四種寫法並不能說明你水平高,真正水平高的人寫出的文章導致洛陽紙貴,水平更高的人的文章被人千古傳頌。

7樓:驢說蛙語

這種問題意義不大,不過既然有想法,也不妨一試,這裡提供乙個簡單的解決方案:

int max(int a, int b)

怎麼使用c語言中的sort排序,在結構體裡面按學號排序??

陳舸 問題描述的不是很清楚,不過我大概猜你是想對某些結構體做排序,結構體裡有個學號的字段,要以學號為標準來排序?可以使用qsort 隨手碼了乙份。include include include typedef struct student Student int compare const void...

C語言中的選擇排序?

郭建波 選擇排序的過程 陣列排序前 7 23 12 4 33 21 2 17 13 9 第一輪迴圈 2 23 12 4 33 21 7 17 13 9 第二輪迴圈4 12 23 33 21 7 17 13 9 第三輪迴圈7 23 33 21 12 17 13 9 第四輪迴圈9 33 21 12 17...

C語言中如何定義可移植的結構體?

專案裡經常遇到類似的情況。我們通常都使用巨集來解決。如 struct myStruct 成員變數型別統一使用 S16 16位有符號數 U16 16位無符號數 S32 32位有符號數 U32 32位無符號數 吳才澤 在真正的多平台移植過程中,結構體定義的可移植性反而不太關注,要關注的是程式本身的可移植...