二进制反序的方法可分为以下四种,涵盖不同场景和效率需求:
一、逐位枚举法(最直观)
通过循环从最低位到最高位逐位提取并重新组合:
```java
int reverseBits(int n) {
int ans = 0;
for(int i = 31; i >= 0; i--) {
ans |= (n & 1) << i;
}
return ans;
}
```
特点:代码简洁,适用于32位整数,时间复杂度为O(32)。
二、查表法(空间换时间)
预先计算0-255的逆序值,通过查表拼接:
1. 创建一个大小为256的数组存储逆序结果;
2. 将32位整数拆分为4个字节,分别查表后按逆序组合。
三、分治法(递归分解)
将32位整数分块处理:
1. 逆序16位 → 逆序8位 → 逆序4位 → 逆序2位;
2. 最后交换相邻2位(如10→01)。
四、位操作法(高效处理)
利用移位和按位或运算:
```java
int reverseBits(int n) {
int res = 0;
for(int i = 0; i < 32; i++) {
res = (res << 1) | (n & 1);
n >>= 1;
}
return res;
}
```
特点:通过循环逐位处理,时间复杂度为O(32),效率较高。
五、字节反转(端序转换)
适用于小端到大端或大端到小端转换:
1. 将32位整数拆分为4个字节;
2. 重新组合为逆序后的二进制数。
选择建议:
简单场景:优先使用逐位枚举法或位操作法;
性能要求高:查表法或分治法更优;
端序转换:采用字节反转方法。