java 求int平均值防止溢位

2021-09-23 18:37:54 字數 624 閱讀 7505

start + (end - start) / 2
int mid = (start + end) >>> 1
它通過移位實現了除以 2,但。。。這樣難道不會導致溢位嗎?

首先大家可以補一下 補碼 的知識。

其實問題的關鍵就是這裡了》 ,我們知道還有一種右移是》。區別在於》為有符號右移,右移以後最高位保持原來的最高位。而》這個右移的話最高位補 0。

所以這裡其實利用到了整數的補碼形式,最高位其實是符號位,所以當 start + end溢位的時候,其實本質上只是符號位收到了進製,而》這個右移可以帶著符號位右移,所以之前的資訊沒有丟掉。

但》有符號右移就會出現問題了,事實上 jdk6 之前都用的》

1、將相同的位進行相加,結果等於兩數按位與的結果的兩倍;(0+0)/2=0  (1+1)/2=1

2、將不同的位進行相加,其結果等於按位異或的結果。(0^1)=1 >>1=0.5

**如下:

public static int mean(int a, int b){

return (x & y) + ((x ^ y) >> 1);

求平均值,防止溢位(只針對整數)

今天看到有人討論c c 中求平均數溢位的問題。於是我便仔細的思考並查詢相關資料。我們很容易發現 a b 2,溢位的 是加法可能產生進製運算,那麼我們只要想辦法避免進製運算就可以了。因為要避免進製我們很自然的就可以想到位運算。我們可以將a,b分為兩個部分 從二進位制的角度來看 乙個是相等的公共部分,另...

位移操作和求平均值溢位

以前寫排序演算法時有用到取index平均值的運算,通常的寫法是這樣的 mid lo hi lo 2 這樣的寫法是為了防止溢位,大家應該都清楚,記得leetcode上有一道題目專門設定了這個陷阱,相加除2的方法會導致結果錯誤。最近在看arraylist系統原始碼時,看到了下面這種寫法 mid lo h...

hive UDAF求平均值

最近做資料遷移專案,把聚合部分從kettle遷移到hadoop集群上,需要寫很多聚合指令碼 在論壇是看到alipay同事寫過類似cube的udaf,拿過來執行下報錯,有幾個地方沒看多,而且沒有注釋,只好從基礎開始看,自己搞乙個,之前寫過udf所以入手還是聽快的 準備 1 實現自己的udaf需要整合u...