Java位运算需基于int的32位补码本质,用<<、>>、>>>和&实现高效操作:<<替代乘2ⁿ,>>对非负数等价整除2ⁿ但负数保留符号位,>>>无条件高位补零,&配合掩码提取或清零特定位。

Java 中位运算符实现高效位移与掩码操作,关键在于理解 int 的 32 位补码本质,并精准使用移位与逻辑运算符组合,避免隐式转换和优先级陷阱。
用左移与右移替代乘除 2 的幂次
左移 等价于乘以 $2^n$,右移 <code>>>(有符号)等价于向零取整的除法,但仅对非负数结果与数学除法一致;负数右移会保留符号位,符合整数除法语义(如 -5 >> 1 得 -3)。
x → 相当于 <code>x * 8-
x >> 4→ 相当于x / 16(整除) - 需无条件高位补零(如解析协议字段、处理位图),必须用
>>>,例如-8 >>> 1得3而非-4
用按位与(&)精准提取或清零特定位
& 是最常用的掩码工具,核心是构造只在目标位为 1、其余为 0 的掩码(如 1 或 <code>0xFF)。
- 检查第
n位是否为 1:(x & (1 - 清零第
n位:x & ~(1 - 保留低 8 位(清高 24 位):
x & 0xFF - 快速判断偶数:
(x & 1) == 0
用异或(^)安全翻转与多状态切换
^ 具有自反性(a ^ a == 0)和恒等性(a ^ 0 == a),适合状态翻转和批量操作。
立即学习“Java免费学习笔记(深入)”;
- 翻转第
n位:x ^= (1 - 同时切换多个位:
x ^= FLAG_READ | FLAG_DEBUG - 启用/关闭组合状态时,避免写成
flags == FLAG_A | FLAG_B(错误!应为(flags & FLAG_A) != 0)
掩码设计与工程实践要点
真实项目中,位掩码不是“会写 & | 就行”,而是要兼顾可维护性与安全性。
- 状态常量必须是 2 的幂,统一用
1 定义(如 <code>public static final int FLAG_WRITE = 1 ),禁用手写 <code>2、4、8 - 类型选
int或long,不用byte/short——Java 位运算自动提升为int,易引发截断 - 清除多位时先清空区域再填值:例如改 GPIO 模式寄存器中连续 2 位,先
reg &= ~(0x3 ,再 <code>reg |= (mode - 调试时用
String.format("0x%08X", flags)直观查看哪几位被置 1


















