一、题目描述
1.1 题目
-
颠倒二进制位
-
颠倒给定的 32 位无符号整数的二进制位。
-
示例 1:
输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。
- 示例 2:
输入:11111111111111111111111111111101
输出:10111111111111111111111111111111
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10101111110010110010011101101001。
-
提示:
请注意,在某些语言(如 Java)中,没有无符号整数类型。在这种情况下,输入和输出都将被指定为有符号整数类型,并且不应影响您的实现,因为无论整数是有符号的还是无符号的,其内部的二进制表示形式都是相同的。
在 Java 中,编译器使用二进制补码记法来表示有符号整数。因此,在上面的 示例 2 中,输入表示有符号整数 -3,输出表示有符号整数 -1073741825。 -
进阶:
如果多次调用这个函数,你将如何优化你的算法?
1.2 知识点
- 位运算
1.3 题目链接
二、解题思路
2.1 解题思路
最直接的思路,将输入的 32 位依次取末尾,左移,然后把取出来的数字放到结果 32 位的末尾,然后右移结果即可。
- 左移结果值,空出 32 位最低位;
- 取输入 32 位的最低位数字
n&1
; - 将取出的最低位赋值给结果值 32 的最低位;
- 右移输入 32 位;
最后,如果需要多次调用这个函数的话可以对部分高频数字颠倒后的结果进行缓存即可。
三、实现代码
3.1 实现代码
public class Solution {
// you need treat n as an unsigned value
public int reverseBits(int n) {
int i=32, ans=0;
while(i-- > 0)
{
ans<<=1;
ans+=n&1;
n>>=1;
}
return ans;
}
}