Marvel-Site Marvel-Site
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)

Marvel

吾必当乘此羽葆盖车
首页
  • Java

    • Java基础
    • Java进阶
    • Java容器
    • Java并发编程
    • Java虚拟机
  • 计算机基础

    • 数据结构与算法
    • 计算机网络
    • 操作系统
    • Linux
  • 框架|中间件

    • Spring
    • MySQL
    • Redis
    • MQ
    • Zookeeper
    • Git
  • 架构

    • 分布式
    • 高并发
    • 高可用
    • 架构
  • 框架

    • React
    • 其他
  • 实用工具
  • 安装配置

    • Linux
    • Windows
    • Mac
  • 开发工具

    • IDEA
    • VsCode
  • 关于
  • 收藏
  • 草稿
  • 索引

    • 分类
    • 标签
    • 归档
GitHub (opens new window)
  • Java

    • Java基础

    • Java进阶

      • 类的初始化与对象的初始化
      • Object类
      • 深度理解字符串String
      • Integer创建对象分析
      • 从原理上分析 i = i++ 与 i = ++i
      • Comparable和Comparator的区别
      • 四种引用介绍
      • 静态代理与动态代理
      • 位运算
        • 位运算常用命令
        • 使用案例
          • 获取大于等于x的最小的2的幂次方的值
    • Java容器

    • Java并发编程

    • Java虚拟机

    • 常见面试题

  • 计算机基础

  • 框架|中间件

  • 架构

  • 后端
  • Java
  • Java进阶
Marvel
2024-05-21
目录

位运算

# 位运算

# 位运算常用命令

  • 与运算(&):对两个操作数的每个对应位执行逻辑与操作,如果两个位都为1,则结果为1,否则为0。
  • 或运算(|):对两个操作数的每个对应位执行逻辑或操作,如果两个位中至少有一个为1,则结果为1,否则为0。
  • 异或运算(^):对两个操作数的每个对应位执行逻辑异或操作,如果两个位相同,则结果为0,否则为1。
  • 非运算(~):对操作数的每个位执行逻辑非操作,将每个位取反。
  • 左移运算(<<):将操作数的所有位向左移动指定的位数,右侧用0填充。
  • 转换by运算(>>):将操作数的所有位向转换by动指定的位数,左侧用符号位填充。
  • 无符号转换by运算(>>>):将操作数的所有位向转换by动指定的位数,左侧用0填充。

# 使用案例

# 获取大于等于x的最小的2的幂次方的值

HashMap 里面有这样一个方法,输入cap,可以计算出大于等于 cap 最小的2的幂次方的值。

static final int MAXIMUM_CAPACITY = 1 << 30;

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;
}
1
2
3
4
5
6
7
8
9
10
11

所有正的2的幂次方都只有1个位被设置为1; 而(2的幂次方 - 1)的所有位都被设置为1,但最高位设置为0。 因此,我们可以通过以下步骤找到下一个最大的2的幂次方:

  1. 减去1
  2. 设置所有较低位的位为1
  3. 再加上1 这些位移操作实现了这个过程的第二步,通过"扩散"设置的位。

扩散操作-举例1:

   01xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx             // 初始值
=> 011xxxxxxxxxxxxxxxxxxxxxxxxxxxxx             // 转换by1
=> 01111xxxxxxxxxxxxxxxxxxxxxxxxxxx             // 转换by2
=> 011111111xxxxxxxxxxxxxxxxxxxxxxx             // 转换by4
=> 01111111111111111xxxxxxxxxxxxxxx             // 转换by8
=> 01111111111111111111111111111111             // 转换by16
1
2
3
4
5
6

扩散操作-举例2:

   0000000000000000000001xxxxxxxxxx             // 初始值
=> 00000000000000000000011xxxxxxxxx             // 转换by1
=> 0000000000000000000001111xxxxxxx             // 转换by2
=> 00000000000000000000011111111xxx             // 转换by4
=> 00000000000000000000011111111111             // 转换by8
=> 00000000000000000000011111111111             // 转换by16
1
2
3
4
5
6

参考:HashMap.tableSizeFor(...). How does this code round up to the next power of 2? (opens new window)

编辑 (opens new window)
上次更新: 2024/05/21, 21:29:15
静态代理与动态代理
Java集合介绍

← 静态代理与动态代理 Java集合介绍→

最近更新
01
二叉树
05-12
02
Spring三级缓存解决循环依赖
03-25
03
ReentrantLock非公平锁的源码分析
02-19
更多文章>
Theme by Vdoing | Copyright © 2022-2024 Marvel
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式