用于返回一個(gè)比給定整數(shù)大且最接近的2的冪次方整數(shù)
/**
* Returns a power of two size for the given target capacity.
*/
static final int tableSizeFor(int cap) {
int n = cap - 1;
n |= n >>> 1;
n |= n >>> 2;
n |= n >>> 4;
n |= n >>> 8;
n |= n >>> 16;
return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
}
>>>是無(wú)符號(hào)右移(高位補(bǔ)0)坏为,假設(shè)從右往左第一個(gè)非0位為最高位薪捍。
右移1位再與移動(dòng)前數(shù)字逐位異或墨微,可以保證最高位和次高位均為1负懦,結(jié)果中前2位均為1(如果最高位所在位數(shù)>1);
將上步結(jié)果右移2位再與移動(dòng)前數(shù)字逐位異或拾氓,可以保證高2位和次高2位均為1,結(jié)果中前4位均為1(如果最高位所在位數(shù)>4,否則最高位以下全1)底哥;
將上步結(jié)果右移4位再與移動(dòng)前數(shù)字逐位異或咙鞍,可以保證高4位和次高4位均為1,結(jié)果中前8位均為1(如果最高位所在位數(shù)>8,否則最高位以下全1)趾徽;
將上步結(jié)果右移8位再與移動(dòng)前數(shù)字逐位異或续滋,可以保證高8位和次高8位均為1,結(jié)果中前16位均為1(如果最高位所在位數(shù)>16,否則最高位以下全1)附较;
之后類似吃粒。
如果傳進(jìn)來(lái)的參數(shù)已經(jīng)是2的次冪了,就不需要變換了拒课,如果變換會(huì)浪費(fèi)空間徐勃,所以函數(shù)開(kāi)頭有一個(gè)n = cap - 1;
測(cè)試結(jié)果如下圖所示: