以前在看源码的时候,有很多地方设置长度或则值为2的N次幂,当时不知道为什么?
今天看HashedWheelTimer代码时
private static int normalizeTicksPerWheel(int ticksPerWheel) {
int normalizedTicksPerWheel = 1;
while (normalizedTicksPerWheel < ticksPerWheel) {
normalizedTicksPerWheel <<= 1;
}
return normalizedTicksPerWheel;
}
以上代码中normalizeTicksPerWheel得出环的大小,取了一个大于等于ticksPerWheel且是2的N次幂的整数。为啥要取成2的N次幂呢?主要是因为在大小而2的N次幂的环上求索引非常的方便,a & (b-1) = a % b,当b时2的N次幂时成立。
为什么要用按位取与,不用%取余?
由于位运算直接对内存数据进行操作,不需要转成十进制,因此处理速度非常快
常用技巧
a & (b-1) = a % b,当b时2的N次幂时成立。