遇见YY

导航

 

下面来自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;
    }

 

posted on 2021-02-04 10:44  一骑红尘妃子笑!  阅读(102)  评论(0编辑  收藏  举报