Java中用左移(

Java 中用位运算计算乘以 2 的幂,核心就是左移()操作:把一个整数左移 <code>n 位,等价于乘以 2^n,且不涉及乘法指令,CPU 执行更快、更轻量。
为什么左移能代替乘法
因为二进制数左移 1 位,所有位向高位移动,低位补 0,数值相当于扩大 2 倍;左移 n 位,就是扩大 2^n 倍。例如:
5 → <code>101 → 十进制 10,即 <code>5 × 2¹3 → <code>11 → 十进制 24,即 <code>3 × 2³
基本写法与注意事项
直接用 替代 <code>* (int)Math.pow(2, n) 或 * (1 形式:
分析 Java Spring Boot 后端 Controller 代码,自动生成 Markdown 格式的接口文档。当用户说“生成 Java 接口文档”、“生成 API 文档”、“从 Spring 代码生成文档”时触发。
- ✅ 推荐:
int result = x (x 和 n 均为 int,n 在 0–31 范围内) - ⚠️ 溢出风险:左移可能导致符号位变化或超出 int 范围(如
Integer.MAX_VALUE 得负数),需业务侧校验 - ⚠️ 负数也适用:
-4 → <code>-16,符合数学意义(负数的补码左移仍保持比例关系) - ❌ 不适用于非 2 的幂:比如 ×12 不能直接用位移,但可拆解为
x (即 ×8 + ×4)
和乘法性能对比与适用场景
JVM 通常会对常量 2 的幂乘法自动优化为位移(尤其在 JIT 编译后),但显式使用 有明确语义优势:
立即学习“Java免费学习笔记(深入)”;
- 代码意图清晰:看到
x 就知道是 ×8,比 <code>x * 8更体现“按位缩放”逻辑(如内存对齐、数组索引倍增) - 嵌入式或高频循环中仍有微小优势:避免乘法单元参与,减少指令延迟
- 配合掩码使用更自然:比如取页号
addr >> 12和页内偏移addr & 0xFFF,整套位操作一气呵成
实际例子:数组扩容、哈希桶定位
像 HashMap 扩容时,新容量为旧容量左移 1 位(×2);定位桶索引常用 hash & (capacity - 1),前提是 capacity 是 2 的幂——这时 capacity 本身往往由 1 构造而来:
int newCap = oldCap // 容量翻倍int tableSize = 1 // 直接定义 1024 大小的表-
int index = hash & (tableSize - 1);// 等价于 hash % tableSize,但更快

















