Java位运算及HashMap的tableSizeFor方法

2019-08-03  本文已影响0人  JaxMa

JAVA 位运算基础

首先在进行位运算之前先讲一下JAVA 的基础知识点(可跳过):

在Java中有两种的位移操作,就是:>> ,<< , >>>

JAVA HashMap.tableSizeFor(int cap) 详解

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;}

以上的代码 的意思是对于任何一个输入 cap 都将返回最近的2的整数次幂的数。
如: 假设入参cap 的二进制为 100111010..(省略)
操作1:n|=n>>>1
n = 100111010..(省略) | 010011101..(省略)
n 为 110011101..(省略)

操作2:n|=n>>>2
n =110011101..(省略) | 001100111..(省略)

ps:在操作2前,n的前两位已经为1了,所以操作2之后的n 为 111100111..(省略)

操作3:n|=n>>>4
n = 111100111..(省略) | 000011110..(省略)
ps:以同样的方式,将前八位都都置1 ,最终n 为 111111110..(省略)

在这几步的位运算之后,入参 cap 的二进制最高位1后也都全部置为1了

return前将 n +1,得到的就是 最近的 2的整数次幂

上一篇 下一篇

猜你喜欢

热点阅读