概述
本题核心是 32 位二进制位反转。初始思路常使用数组配合短除法,但存在有符号数处理、前导零丢失及浮点精度隐患。通过位运算可更高效地实现。
题目描述
190. 颠倒二进制位 颠倒给定的 32 位无符号整数的二进制位。
例如:
输入:00000000 00000000 00000000 00000001
输出:10000000 00000000 00000000 00000000
暴力解法
利用进制转换和数组实现,核心步骤为:十进制转二进制 → 颠倒二进制 → 二进制转十进制。
- 十进制转二进制:短除法。
- 颠倒二进制:存入数组后反向遍历。
- 二进制转十进制:累加计算。
代码
class Solution {
public:
int reverseBits(int n) {
int arr[32];
int index = 0;
int a = n;
// 短除法:十进制转换为二进制
while (a != 0) {
arr[index++] = a % 2;
a /= 2;
}
index = 31;
// 二进制转换为十进制
int res = 0;
int b = 0; // 次幂
while (index >= 0) {
res += arr[index--] * pow(2, b++);
}
return res;
}
};
存在问题
- int 是有符号数,负数处理可能出错。
- 短除法无法保留高位 0,导致前导 0 丢失。
- 使用
pow(2, b)涉及浮点运算,可能产生精度误差。
官方题解:逐位颠倒
核心思想:将 32 位整数一位一位取出,再放到反转后的位置。 位运算:


