感觉应该是这样。加入现在这个数不是二的整次方,那么就这样让他变成2的整次方。
前提条件是这个是大于最小初始化容量8
还有一个前提,就是用二进制表示这个数,比如说是
分两种情况
a.0000 0000 0000 0000 0000 0000 0100 0000
b.0000 0000 0000 0000 0000 0000 0110 0000
第一个1出现在第26位,那么要做的就是
- 先把第27-32的0 全部替换位1,
- 用上边这个数+1
前置知识:
0|1=1
1|0=1
0|0=0
1|1=1
所以第一步操作,就相当于把最高位上的1,做了(1+2+4+8+16) 31次复制操作,相当于第26位的1复制到了27-32位上。然后加一就是,比这个数大的最小的二次幂。
java.util.ArrayDeque#calculateSize
private static int calculateSize(int numElements) {
int initialCapacity = MIN_INITIAL_CAPACITY;
// Find the best power of two to hold elements.
// Tests "<=" because arrays aren't kept full.
if (numElements >= initialCapacity) {
initialCapacity = numElements;
initialCapacity |= (initialCapacity >>> 1);
initialCapacity |= (initialCapacity >>> 2);
initialCapacity |= (initialCapacity >>> 4);
initialCapacity |= (initialCapacity >>> 8);
initialCapacity |= (initialCapacity >>> 16);
initialCapacity++;
if (initialCapacity < 0) // Too many elements, must back off
initialCapacity >>>= 1;// Good luck allocating 2 ^ 30 elements
}
return initialCapacity;
}