【題目】
給定兩個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 這是個好方法,不過題目說了...