Q:给定一个数,找到第一个大于等于这个数的2的幂。例如给定15,则2的幂中,16,32都比15大,但是16是第一个,因此返回16。
A:参考HashMap源码中的实现,HashMap扩容,容量都是2的幂次。
/**
* 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;
}
其中5个或操作会将一个32位整数的二进制表示中,最高位的1右边的所有位都设为1,然后再加上1,就是第一个大于等于这个32位整数的2的幂。
int a=0b1000_0000_0000_0000_0000_0000_0000_0000;
a |= a>>>1;
System.out.println(Integer.toBinaryString(a));//11000000000000000000000000000000
a |= a>>>2;
System.out.println(Integer.toBinaryString(a));//11110000000000000000000000000000
a |= a>>>4;
System.out.println(Integer.toBinaryString(a));//11111111000000000000000000000000
a |= a>>>8;
System.out.println(Integer.toBinaryString(a));//11111111111111110000000000000000
a |= a>>>16;
System.out.println(Integer.toBinaryString(a));//11111111111111111111111111111111