integer.reverse 反转 int 的 32 位二进制补码表示(含前导零)的位序,采用分治位运算:依次用掩码 0x55555555、0x33333333、0x0f0f0f0f 等交换相邻 1、2、4、8、16 位,无分支高效完成。

Integer.reverse 是 Java 中用于反转一个 int 类型整数的**32 位二进制表示中所有位的顺序**的方法。它不反转数值符号或十进制意义,而是将 32 位补码形式(含前导零)从左到右完全翻转:第 0 位(最低位)和第 31 位(最高位)互换,第 1 位与第 30 位互换……以此类推。
核心逻辑:分治位运算
该方法底层采用高效、无分支的分治策略,通过多轮位移和掩码操作,逐步交换相邻位、相邻 2 位、相邻 4 位……直到完成整个 32 位的翻转。这种实现避免了循环和条件判断,执行速度极快。
关键步骤如下:
- 先交换每对相邻的 1 位(即奇偶位互换),用掩码
0x55555555(二进制01010101...)分离奇偶位 - 再交换每对相邻的 2 位(如 [0-1] 与 [2-3] 交换),用掩码
0x33333333(00110011...)分组 - 接着交换每对相邻的 4 位,用掩码
0x0f0f0f0f - 然后交换相邻的 8 位(半字节级),最后交换两个 16 位块(即高低半字)
举例说明
以 0b00000000_00000000_00000000_00000101(十进制 5)为例:
- 32 位补码表示为:
00000000 00000000 00000000 00000101 - 反转后变成:
10100000 00000000 00000000 00000000 - 对应十进制值为
-1530494976(因最高位变为 1,解释为负数)
注意点
该方法处理的是固定 32 位,不管数值本身是否“需要”那么多位。例如:
-
Integer.reverse(1)→ 反转0...0001(31 个 0 + 1 个 1)→ 结果是1000...0(最高位为 1,其余为 0),即0x80000000,等于-2147483648 - 它不等价于“反转有效二进制位”,也不做零截断或符号扩展调整
- 结果始终是
int,即使反转后高位为 1,也按补码解释
可替代的手动实现(理解用)
若想自己写一个易懂版本(非高性能),可用循环逐位构造:
public static int reverse(int i) {
int result = 0;
for (int bit = 0; bit <p>但标准库的 <code>Integer.reverse</code> 使用位运算组合,单条指令即可完成每步交换,性能远高于循环版本。</p>Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











