找大于等于一个数的最小的2^n

最近看hashmap源码时,发现给定初始capacity计算threshold的过程很巧妙。
1 static final int tableSizeFor(int cap) {
2     int n = cap - 1;
3     n |= n >>> 1;
4     n |= n >>> 2;
5     n |= n >>> 4;
6     n |= n >>> 8;
7     n |= n >>> 16;
8     return (n < 0) ? 1 : (n >= MAXIMUM_CAPACITY) ? MAXIMUM_CAPACITY : n + 1;
9 }
这里是实现了找大于等于cap的最小2^n。cap为int类型,长度32位。
对于一个正数,找大于该数的最小的2^n,都可以采用这种方式,将n最高位后面全部置为1,然后加1。
相对于一直将n>>>1,找到最高位的位数再构造新树而言,对于比较大的n来说操作次数更少。
   n |= n >>> 1;
    n |= n >>> 2;
    n |= n >>> 4;
    n |= n >>> 8;
    n |= n >>> 16;
    n += 1;

 

posted @ 2021-03-30 09:51  凝冰物语  阅读(104)  评论(0编辑  收藏  举报