返回一个比给定整数大且最接近的2的幂次方整数,如给定10,返回2

2017-10-15  本文已影响0人  风逝勿追

代码如下:

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;

}

tableSizeFor(int cap)是hashMap中的一个Static函数,主要功能是返回一个比给定整数大且最接近的2的幂次方整数,如给定10,返回2的4次方16.

这个算法的原理是什么呢:

我们首先假定cap也就是给定数的的形式为00..01XXXXXXX,(X代表可为0也可为1,X前面的1为从最高位开始第一个为1的那一位)

首先是n |= n >>> 1;也就是n变成n与n右移一位之后或后的值,即

n: 00..01XXXXXXX

n>>>1:00..001XXXXXX

新n: 00..011XXXXXX

也许到这里你还看不出什么结果,那接着看第二步n |= n >>> 2;也就是n变成n与n右移两位之后异或的值,即

n: 00..011XXXXXX

n>>>2:00..00011XXXX

新n: 00..01111XXXX

到这里就不用再解释了吧,这个算法不断的通过把第一个1开始后面的位变成1,本例由00..01XXXXXXX->00..011111111,最后再返回n+1;

太精巧了这个算法!!!!!

转自http://blog.csdn.net/dagelailege/article/details/52972970

上一篇下一篇

猜你喜欢

热点阅读