Java Tricks —— 不小于一个数的最小2的幂次方
不小于一个数的最小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的幂次方相关推荐
- 快速判断一个数是否是4的幂次方,若是,并判断出来是多少次方! .
将4的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1(1在奇数位置),并且1后面跟了偶数个0: 因此问题可以转化为判断1后面是否跟了偶数个0就可以了. 4的整数次幂的二进制数都为 ...
- 快速判断一个数是否是2的幂次方
public class Test {public static void main(String[] args) {int num = 10;if (0 == (num & (num - 1 ...
- 快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!
将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个0就可以了. 如果将这个数减去1后会发现,仅有的那个1会变为 ...
- 如何判断一个数是否为2的幂次方
最近在OJ上做题,遇到一道题,其中一个细节就是需要判断一个数是否为2的幂次方.初看似乎很简单,可我想来想去,竟然无甚好办法.最后我用一个笨办法解决了,那就是将2 4 8 16 32- -存到一个数组里 ...
- C语言编程判断是否为2的幂,C语言判断一个数是否是2的幂次方或4的幂次方
快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方!将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n个 ...
- 在C语言中如何判断一个数是不是2的幂次方,判断一个数是否为2的幂次方的方法...
对于如何判断一个数是否为2的幂次方这个问题是很多新手们都好奇的,今天我们就带着这个疑问跟小编去看看判断一个数是否为2的幂次方的方法吧,感兴趣的小伙伴们赶紧收藏起来. 将2的幂次方写成二进制形式后,很容 ...
- 把一个数转换成2的幂次方
uint32_t _test(uint32_t x){x--;x |= x>>1;x |= x>>2;x |= x>>4;x |= x>>8;x |= ...
- C语言判断是不是2的幂次方,C语言判断一个数是否是2的幂次方或4的幂次方
快速判断一个数是否是2的幂次方,若是,并判断出来是多少次方! 将2的幂次方写成二进制形式后,很容易就会发现有一个特点:二进制中只有一个1,并且1后面跟了n个0: 因此问题可以转化为判断1后面是否跟了n ...
- 判断一个数是否是 2、3、4的幂次方
2的几次幂 判断一个数是否是 2的幂次方: 思路:在二进制中 2^n形式如下 2^1=2:10 1:01 2^2=4:100 ...
最新文章
- spark—3(Spark Scheduler)
- 【Python 自然语言处理 第二版】读书笔记2:获得文本语料和词汇资源
- 面向对象的三大特征继承,封装和多态性
- 思维风暴 codeforces (1060A) Phone Numbers
- addView的误区
- 爬虫 spider05——使用httpclient发送get请求、post请求
- jquery源码之低调的回调函数队列--Callbacks
- 根据自己的博客数据统计国内IT人群
- iOS CoreData简单入门 - Swift版
- Map的传统输出和使用增强for循环的输出
- 计算机网络第五次笔记
- Visio2016下载激活破解
- 计算机房维修保养记录表,机房设备系统运行及维护记录学习表格.docx
- visio增加连接点
- 概率论与数理统计(第二章---随机变量及其分布函数
- 17、文件IO详解及实例
- 业务流程图绘制方法经验谈(下篇)
- 青少年软件编程C++一级题库(31-40)
- 注册石墨文档无法连接服务器,石墨文档没有访问权限怎么办
- Window自带的定时自动执行程序
热门文章
- Ubuntu14.04+RabbitMQ3.6.3+Golang的最佳实践
- Stage3D 入门资源汇总
- mysql jdbc配置重连_Spring Boot 配置MySQL数据库重连的操作方法
- java jsp输出乱码,这是小弟我的JSP文件,输出后,汉字显示为乱码,怎么解决
- jmeter性能测试用户参数参数化
- 哦,指针问题的见解啊
- 剑指offer面试题32 - III. 从上到下打印二叉树 III(二叉树)(BFS)
- Python基础——正则表达式
- TensorFlow 图像预处理(二) 图像翻转,图像色彩调整
- leetcode 682. 棒球比赛(Baseball Game)