leetcode190. 颠倒二进制位
颠倒给定的 32 位无符号整数的二进制位。
示例 1:
输入:n = 00000010100101000001111010011100
输出:964176192 (00111001011110000010100101000000)
解释:输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
示例 2:
输入:n = 11111111111111111111111111111101
输出:3221225471 (10111111111111111111111111111111)
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。
题目解析
题目要求我们实现一个函数,将一个无符号整数的二进制位进行反转。
算法分析
这个问题可以通过位操作来解决。我们需要遍历整数的每个二进制位,将其反转,然后构建反转后的整数。
算法步骤
- 初始化结果变量
res
为0。 - 设置一个计数器
t
,初始值为31(因为一个32位整数的最高位索引为31)。 - 在
t
大于0的情况下,执行以下操作:- 将
res
与n
的最低位进行按位或操作,以将n
的最低位加到res
上。 - 将
n
右移一位,以检查下一位。 - 将
res
左移一位,为下一次循环做准备。 - 将
t
减1。
- 将
- 如果
n
的最低位为1,将res
加1(因为最后右移的n
可能丢失了最低位的1)。 - 返回结果变量
res
。
算法流程
具体代码
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res=0;
int t=31;
while(t)
{
res+=n&1;
n>>=1;
res<<=1;
t--;
}
if(n&1) res++;
return res;
}
};
算法分析
- 时间复杂度: O(1),因为我们只需要遍历32位整数一次。
- 空间复杂度: O(1),我们只需要常数级别的额外空间来存储结果和临时变量。
易错点
- 正确处理最低位可能丢失的情况。
- 确保在循环中正确地更新
res
和n
。
相似题目
题目 | 链接 |
---|---|
反转整数 | https://leetcode.cn/problems/reverse-integer/ |
位1的个数 | https://leetcode.cn/problems/number-of-1-bits/ |
二进制手表 | https://leetcode.cn/problems/binary-watch/ |