2017-07-19 83 views
1

我HAVA看到這個代碼在HashMap中:約(位和)運算符

/** 
* Returns index for hash code h. 
*/ 
static int indexFor(int h, int length) { 
    // assert Integer.bitCount(length) == 1 : "length must be a non-zero power of 2"; 
    return h & (length-1); 
} 

的HashMap具有本文檔: 當長度是兩個則h &(長度-1)是等於功率H%長度

我想知道,在數學 原則恰恰是爲什麼^ h &(長度1)== X%的長度(長度爲二的冪)

+0

十進制,10^n = 100000000 ...; 10^n - 1 = 9999999 ...。原理相同。 – Ryan

+0

你能詳細給我解釋一下嗎?我仍然困惑 – Timi

回答

1

首先,你可以認爲它是什麼,當你把2


WLOG的任意整數n國防部功率讓2這款電源是二進制10000(事實上,它的形式必須是100...0的)一樣,它的倍數是多少?它的倍數必須看起來像...whatever digit...0000。最後4位數字必須爲零。

那麼什麼是數字n mod 10000?讓這個數字n...whatever digit...1011。這個數字可以表示爲...whatever digit...0000 + 1011,現在很明顯n mod 10000確實只剩下最後4位數字。

一般而言,讓length是2的冪,其具有x零,則n%lengthn


的至少x顯著位數所以legnth - 1確實111..111x數字1) ,並且當您按位進行編號並且編號爲n時,n的最低有效位數x被保留d並返回,這是我們想要的。使用上面的同一個例子,

Length = 10000, Length - 1 = 1111 
n = 101001101 = 101000000 + 1101 
=> n % Length = 1101 

n & (Length - 1) = 1101 
= n % Length 
0

試想:任何兩個功率包含單個位設置,並具有這樣的二進制表示:

 l = 00010000 

如果你減去1,它將包含那些在正確的地方

m = l-1 = 00001111 

二進制和操作任何^ h品牌所有最顯著位爲零,少留顯著者

 10101010 & 00001111 = 00001010 

這等同於模運算與模升