下面来自Java8 HashMap的部分源码:
static final int MAXIMUM_CAPACITY = 1 << 30; 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; }
int n = cap - 1; /**为了应对参数cap恰好是2的整数幂情况**/
注意:这里右移的过程中是按指数形式(1,2,4,8,16)的长度移位,不是一次仅仅移一位!
本质上求一个大于等于某个整数的2次幂:
1:如果这个数字恰好就是2的整数幂,则直接返回。
2:否则将这个数的2进制形式的数的所有位,置为1,然后在加1返回。。
补充:>> 有符号有移,>>> 无符号右移。
Java7 相关代码:
static final int highestOneBit(int i) { i |= i >>> 1; i |= i >>> 2; i |= i >>> 4; i |= i >>> 8; i |= i >>> 16; return i - (i>>>1); }
将某个数二进制形式的所有位,置1代码:
int Help(int x) { x |= x >>> 1; x |= x >>> 2; x |= x >>> 4; x |= x >>> 8; x |= x >>> 16; return x; }