在某些情況下,例如分段樹或二分搜索,我必須獲得 2 個數字的平均值。
一個簡單的解決方案是mid = (a b) / 2. 但是當涉及到a并b具有相同的正負號時,a b事情就會溢位。例如,1234567 2147483647int32-1234567 (-2147483647)型別。
我上網查了一下才知道mid = (b - a) / 2 a,可以避免上面的情況,但還是不完美。當涉及到a并b具有不同的正負號時,mid = (a b) / 2不會溢位但(b - a) / 2 a會溢位。例如-2147483648 2147483647int32 型別。
為了徹底解決這個問題,我在下面的圖片中撰寫了代碼。我將這兩種情況除以正負號。(我使用了一些位操作來提高它的效率。)但是對于這樣一個簡單的問題來說它太復雜了,對吧?
這個問題有一些優雅的解決方案嗎?

我試圖將問題分為兩種情況并分別解決。但我仍然想要一個更優雅的解決方案。
uj5u.com熱心網友回復:
得到了答案!
mid = (a & b) ((a ^ b) >> 1)
a & b保持 a 和 b 共有的相同位,它們不需要平均分布。就像當你找到 和 的平均值時102,110你不需要計算100它們的共同點。您可以保留它,并處理2和10部分,將它們平均分配給 2 個數字。作為(102 110) / 2 = (2 * 100 2 10) / 2 = 100 (2 10) / 2 = 100 6 = 106.
(a ^ b) >> 1處理“2和10部分”,它獲取 a 和 b 沒有共同點的所有位,并將其除以 2。
將上面的 2 個部分相加,得到 a 和 b 的平均值。雖然不是嚴格的證明。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/526264.html
標籤:数学数学表达式
