不小于一个数的最小2的幂次方,对于 10 就是 16,对于 21 就是 32.

以下实现摘自 java HashMap 的源码:

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减1,是为了避免参数cap本来就是2的幂次方,这样一来,经过后续的未操作的,cap将会变成2 * cap,是不符合我们预期的。
  • n >>> 1 使得 n 的最高位为0;
    • n |= n>>>1,则 n 的前两位为1;
  • n |= n >>> 2:n 的前 4 位均为 1;
  • n |= n >>> 4:n 的前 8 为均为 1;
  • n |= n >>> 8:n 的前 16 为均为 1;
  • n |= n >>> 16:n 的前 32 为均为 1;

如果入参为 20:

int n = cap - 1;        // 19, 10011
n |= n >>> 1;           // 21, 11011
n |= n >>> 2;           // 31, 11111
n |= n >>> 4;           // 31, 11111
n |= n >>> 8;           // 31, 11111
n |= n >>> 16;          // 31, 11111
n+1             // 32 = 2^5

源码分析之 HashMap

Java Tricks —— 不小于一个数的最小2的幂次方相关推荐

  1. 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! .

    将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0: 因此问题可以转化为判断1后面是否跟了偶数个0就可以了. 4的整数次幂的二进制数都为 ...

  2. 快速判断一个数是否是2的幂次方

    public class Test {public static void main(String[] args) {int num = 10;if (0 == (num & (num - 1 ...

  3. 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!

    将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个0就可以了. 如果将这个数减去1后会发现,仅有的那个1会变为 ...

  4. 如何判断一个数是否为2的幂次方

    最近在OJ上做题,遇到一道题,其中一个细节就是需要判断一个数是否为2的幂次方.初看似乎很简单,可我想来想去,竟然无甚好办法.最后我用一个笨办法解决了,那就是将2 4 8 16 32- -存到一个数组里 ...

  5. C语言编程判断是否为2的幂,C语言判断一个数是否是2的幂次方或4的幂次方

    快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个 ...

  6. 在C语言中如何判断一个数是不是2的幂次方,判断一个数是否为2的幂次方的方法...

    对于如何判断一个数是否为2的幂次方这个问题是很多新手们都好奇的,今天我们就带着这个疑问跟小编去看看判断一个数是否为2的幂次方的方法吧,感兴趣的小伙伴们赶紧收藏起来. 将2的幂次方写成二进制形式后,很容 ...

  7. 把一个数转换成2的幂次方

    uint32_t _test(uint32_t x){x--;x |= x>>1;x |= x>>2;x |= x>>4;x |= x>>8;x |= ...

  8. C语言判断是不是2的幂次方,C语言判断一个数是否是2的幂次方或4的幂次方

    快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方! 将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n ...

  9. 判断一个数是否是 2、3、4的幂次方

    2的几次幂 判断一个数是否是 2的幂次方: 思路:在二进制中 2^n形式如下 2^1=2:10                          1:01 2^2=4:100              ...

最新文章

  1. spark—3(Spark Scheduler)
  2. 【Python 自然语言处理 第二版】读书笔记2:获得文本语料和词汇资源
  3. 面向对象的三大特征继承,封装和多态性
  4. 思维风暴 codeforces (1060A) Phone Numbers
  5. addView的误区
  6. 爬虫 spider05——使用httpclient发送get请求、post请求
  7. jquery源码之低调的回调函数队列--Callbacks
  8. 根据自己的博客数据统计国内IT人群
  9. iOS CoreData简单入门 - Swift版
  10. Map的传统输出和使用增强for循环的输出
  11. 计算机网络第五次笔记
  12. Visio2016下载激活破解
  13. 计算机房维修保养记录表,机房设备系统运行及维护记录学习表格.docx
  14. visio增加连接点
  15. 概率论与数理统计(第二章---随机变量及其分布函数
  16. 17、文件IO详解及实例
  17. 业务流程图绘制方法经验谈(下篇)
  18. 青少年软件编程C++一级题库(31-40)
  19. 注册石墨文档无法连接服务器,石墨文档没有访问权限怎么办
  20. Window自带的定时自动执行程序

热门文章

  1. Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
  2. Stage3D 入门资源汇总
  3. mysql jdbc配置重连_Spring Boot 配置MySQL数据库重连的操作方法
  4. java jsp输出乱码,这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解决
  5. jmeter性能测试用户参数参数化
  6. 哦,指针问题的见解啊
  7. 剑指offer面试题32 - III. 从上到下打印二叉树 III(二叉树)(BFS)
  8. Python基础——正则表达式
  9. TensorFlow 图像预处理(二) 图像翻转,图像色彩调整
  10. leetcode 682. 棒球比赛(Baseball Game)