求最接近cap的2次冪(tableSizeFor函式的實現)
阿新 • • 發佈:2019-02-13
不比cap小的2次冪(HashMap中的tableSizeFor函式)
// 初始化臨界值的具體實現 static final int tableSizeFor(int cap) { int n = cap - 1; n |= n >>> 1;//現將n無符號右移1位,並將結果與右移前的n做按位或操作,結果賦給n; n |= n >>> 2; n |= n >>> 4; n |= n >>> 8; n |= n >>> 16; //中間過程的目的就是使n的二進位制數的低位全部變為1,比如10,11變為11,100,101,110,111變為111; return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1; }
ps:假設n=00..01xxxxxx,則 n |=n >>> 1之後,變成 00..011xxxxxx,然後 n |=n >>> 2 之後 變成00..01111xxxxxx,以此類推,n |=n >>> 16 之後,n一定變成00..01111111111,這樣,中間過程之後,原始n的最高位1後面全部是1,因此n+1為2次冪
不比cap大的2次冪
去掉最高位1後面的1
int powerOf2(int cap){ if(cap<0){ return 0; } int last=cap; while(cap!=0){ last=cap; cap&=cap-1; } return last; }