高效取余運算(n-1)&hash原理探討


JavaHashMap源碼中用到的(n-1)&hash這樣的運算,查找發現這是一種高效的求余數的辦法,但其中的原理是什么呢為什么可以這么做呢?

先上結論:假設被除數是x,對於除數是2n的取余操作x%2n,都可以寫成x&(2n-1),位運算效率高!

 

eg:259%8=259&7=3

259    100000011
7      000000111
259&7=011=3

 

網上對這個原因的解釋都是模糊不清,下面是我對於這個等式為什么成立的一些理解。

就拿上面這個259%8進行舉例。

259的二進制為1000000118的二進制為1000

假如對8進行取余,那么只需要留下最后4位,前面的都可以舍棄,為什么呢?

因為比8更高位的都來自於82次冪,所以高位的1都是可以整除8,可以直接舍棄。

這解釋了為什么只有除數是2n才可以這樣的操作,因為如果除數是9的話,高位不一定能整除9,無法舍棄所以不行。(其余2n除數也同理)

也解釋了為什么位數不同也可以做&操作,因為比除數高的位都是可以舍棄的。

 

 

 

然后就是&操作了,直接&8的話是不行的,假設最后四位是1XXX,那么1XXX&1000=1000,很明顯對8取余得到的結果不可能是8,余數應在0到除數減一之間,

所以我們需要對&7,讓取余結果最大在0-7之間。

這就解釋了為什么要&(2n-1)

那有些人會問了,那我就是要&8,不就是相當於對9取余嗎?

9取余就違反了上面的:“只有除數是2n才可以這樣的操作

以上是個人對這個取余原理的理解,歡迎討論


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM