
本文详解如何正确反转一个32位整数的二进制位序(bit-level reversal),指出原代码逻辑错误,并提供高效、健壮的实现方案,支持符号位处理与边界兼容。
本文详解如何正确反转一个32位整数的二进制位序(bit-level reversal),指出原代码逻辑错误,并提供高效、健壮的实现方案,支持符号位处理与边界兼容。
反转32位整数的比特位顺序(例如将 00000010100101000001111010011100 反转为 00111001011110000010100101000000)是常见位运算面试题。原实现存在多个关键问题:
- 使用
long n作为参数但未对输入做32位截断,导致高位干扰; - 采用“首尾交换”思路时,误将
rev定义为int,且未初始化为0L,溢出风险高; - 条件判断
(n&(1 在 <code>f≥31时,1 对 <code>int是未定义行为(Java中1 为负数),且 <code>n若为long,1 仍为 <code>int,造成隐式截断; - 更根本的是:该算法试图原地交换位,却未保证每次只处理一位,也未统一以无符号方式解析输入。
✅ 推荐解法:逐位提取 + 左移构建(简洁、安全、可读性强)
public class Solution {
// 输入为 int,确保仅处理低32位;返回 long 避免符号扩展干扰打印
public static long reverseBits(int n) {
long reversed = 0;
for (int i = 0; i < 32; i++) {
reversed = (reversed << 1) | (n & 1); // 提取 n 的最低位,追加到 reversed 末尾
n >>>= 1; // 无符号右移,确保符号位也被当作普通位处理
}
return reversed;
}
}? 关键细节说明:
- 使用
n >>>= 1(无符号右移)而非n >>= 1,防止负数因符号扩展引入额外1; -
reversed声明为long,容纳32位反转后可能超出int范围的值(如Integer.MIN_VALUE反转后为0x40000000,仍是正数,但某些输入会生成高位1); - 循环固定 32 次,严格保证所有位参与反转,不依赖输入数值大小;
-
n & 1安全提取当前最低有效位(LSB),无论n正负。
? 使用示例:
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
立即学习“Java免费学习笔记(深入)”;
public static void main(String[] args) {
System.out.println(reverseBits(0b00000010100101000001111010011100)); // 输出: 536870912 (0b00100000000000000000000000000000)
System.out.println(reverseBits(-3)); // -3 的补码为 0xFFFFFFFD → 反转后为 0xBFFFFFFF = 3221225471L
}⚠️ 注意事项:
- 若题目要求返回
int,需显式强转:return (int) reversed;,但注意高位截断(Java 中long → int丢弃高32位); - 不要直接对
long类型参数做位反转(除非明确要求64位),否则逻辑与题意不符; - 测试时建议用十六进制或二进制字面量(Java 7+ 支持
0b...)验证位模式,避免十进制误解。
此方法时间复杂度 O(1)(固定32次循环),空间复杂度 O(1),逻辑清晰、鲁棒性强,是工业级位反转的标准实践。

















