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

2021-10-03 03:16:25 字數 1829 閱讀 1422

【題目】

給定兩個32位整數a和b,返回a和b中較大的。

【要求】

不用任何比較判斷。

判斷轉換位運算實現

sign獲取符號位,flip翻轉符號位

判斷a-b的符號位

符號位為0表示為正,符號位為1表示為負

為正返回a,為負返回b

因此same=flip(sign(a-b)) * a + sign(a-b) * b返回同號兩者較大值

a-b結果可能溢位,新增條件判斷——異號時符號位與被減數相同

dif=flip(sign(a)) * a + sign(a) * b返回異號兩者較大值;

最終結論

通過a和b符號位是否相同(flag_dif=sign(a) ^ sign(b)),結合同號異號的情況。

flag_dif * dif + flip(flag_dif) * same返回最終兩者較大值。

# 翻轉

# 注意不能使用~n,~0=-1,~1=-2,因為~是整個數按位取反

defflip

(n):

return n ^

1# 獲取32位整型符號位,0為正數,1為負數

# (n & 0x80000000) >> 31亦可

defsign

(n):

return

(n >>31)

&1# 判斷a-b的符號

# a-b存在結果溢位問題,需新增條件判斷——異號時符號位與被減數相同

defget_max

(a, b)

: sub = a - b

sign_sub = sign(sub)

same = flip(sign_sub)

* a + sign_sub * b # 同號結果

sign_a = sign(a)

# a的符號位,0為正,1為負

sign_b = sign(b)

flag_dif = sign_a ^ sign_b # a,b是否異號,0表示false,1表示true

dif = flip(sign_a)

* a + sign_a * b # 異號結果

return flag_dif * dif + flip(flag_dif)

* same

# 簡單測試

if __name__ ==

'__main__'

: n =

10print

(sign(n)

)# 0

n =-10

print

(sign(n)

)# 1

n =100print

(sign(n)

)# 0

n =-100

print

(sign(n)

)# 1

print

(get_max(3,

4))# 4

print

(get_max(4,

3))# 4

print

(get_max(-3

,4))

# 4print

(get_max(3,

-4))

# 3

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

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

不用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 這是個好方法,不過題目說了...