tableSizeFor(int cap)方法的主要作用:
将参数cap转换成2的n次幂(向上转)
例如:7 转成 8; 3 转成 4; 12 转成 16;32 转成 32;
代码:
public static void main(String[] args) {
System.out.println(tableSizeFor(3));// 4
System.out.println(tableSizeFor(7));// 8
System.out.println(tableSizeFor(12));// 16
System.out.println(tableSizeFor(32));// 32
}
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 + 1;
}
那么这个算法是怎么实现的呢?
原理分析:
|= 这个运算符的意思:
a |= b
a | b 再将结果复制给 a (类似 a += b)
拿cap = 3的时候来举例:
n = 3 -1 = 2 ==> 二进制为:0000 0010
解析:n |= n >>> 1;
n >>> 1 是将n无符号右移1位,即:0000 0001
n为2(0000 0010)与0000 0001 的或结果为:0000 0011
······
下面的操作也是类似,最后n的结果为:
0000 0011
返回值 n+1 的结果为:0000 0100即:4
总结:
这个算法会把从第一个 1 开始后面的所有位都变成1 ,最后返回结果的时候 +1 返回的就是 2的n次幂了
问题:为什么第一次进方法时要 -1 呢?
答:因为要兼容 cap 本身就是 2的n次幂的情况。
例如:cap 是4 (0100),如果不 -1 的话 最后n的结果为 :0111 ,返回值再进行 +1的操作的时候返回的就是 8了。
网友评论