有趣的小算法

找到一个大于等于目标容量的最小的2的幂次方数,常用于实现具有动态扩展能力的数据结构。

示例:HashMap的扩容大小机制。

java 复制代码
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;
}
  • a. 将n无符号右移一位。
  • b. 对原n和右移后的n进行按位或操作。
  • c. 将结果赋值回n。

这样做的目的是为了确保n的二进制表示中的所有非零位都被设置为1。这是因为每次右移一位后,原最高位会被移到次高位,并且按位或操作可以保证只要原来的最高位为1,那么新的次高位也将变为1。重复这个过程直到所有可能的位置都被覆盖到,从而得到大于等于目标容量的最小的2的幂次方数。

当cap = 25,最后返回32

相关推荐
夜晚中的人海23 分钟前
【C++】位运算算法习题
开发语言·c++·算法
稚辉君.MCA_P8_Java26 分钟前
Java 基本数据类型 - 四类八种
java·linux·后端·mysql·架构
裸奔在上海31 分钟前
使用Java做URL短连接还原长链接获取参数
java·开发语言·程序人生·spring
爱吃烤鸡翅的酸菜鱼31 分钟前
如何掌握【Java】 IO/NIO设计模式?工厂/适配器/装饰器/观察者模式全解析
java·开发语言·后端·设计模式·nio
鳳舞酒天32 分钟前
Maven 下载和 Spring Boot 搭建
java·spring boot·maven
superior tigre1 小时前
(huawei)5.最长回文子串
c++·算法
I'm Jie1 小时前
Gradle 的项目结构与源码集(Source Sets)详解(Kotlin DSL)
android·java·开发语言·spring boot·spring·kotlin·gradle
OG one.Z1 小时前
08_集成学习
人工智能·算法·机器学习
chilavert3181 小时前
技术演进中的开发沉思-151 java-servlet:会话管理
java·开发语言
SheepHappy1 小时前
MyBatis-Plus 源码阅读(一)CRUD 代码自动生成原理深度剖析
java