题目描述和难度
- 题目描述:
颠倒给定的 32 位无符号整数的二进制位。
示例:
输入: 43261596 输出: 964176192 解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 , 返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
进阶:
如果多次调用这个函数,你将如何优化你的算法?
- 题目难度:简单。
- 英文网址:190. Reverse Bits 。
- 中文网址:190. 颠倒二进制位 。
思路分析
求解关键:这道题并不难,可以用字符串的方法来做,也可以用位运算的方法来做。
参考解答
参考解答1
public class Solution {
// you need treat n as an unsigned value
// 00000010100101000001111010011100
// 10100101000001111010011100
/**
* 比较简单粗暴,拿字符串转来转去
*
* @param n
* @return
*/
public int reverseBits(int n) {
String toBinaryString = Long.toBinaryString(n);
StringBuilder stringBuilder = new StringBuilder(toBinaryString);
// 不够 32 位的左补 0
while (stringBuilder.length() < 32) {
stringBuilder.insert(0, 0);
}
String str = stringBuilder.reverse().toString();
return Integer.valueOf(str, 2);
}
public static void main(String[] args) {
Solution solution = new Solution();
int n = 43261596;
int reverseBits = solution.reverseBits(n);
System.out.println(reverseBits);
}
}
参考解答2
public class Solution2 {
// you need treat n as an unsigned value
public int reverseBits(int n) {
// 0 其实不用特殊考虑
if (n == 0) {
return 0;
}
int res = 0;
// 这里不能使用 while(n!=0) ,因为我们要考虑到最高位补 0 的情况
for (int i = 0; i < 32; i++) {
// 先左移,让出位置来
res <<= 1;
// 当前考虑的这个数位是 0 还是 1
res += n & 1;
n >>= 1;
}
return res;
}
public static void main(String[] args) {
Solution2 solution2 = new Solution2();
int n = 43261596;
int reverseBits = solution2.reverseBits(n);
System.out.println(reverseBits);
}
}
本篇文章的地址为 https://liweiwei1419.github.io/leetcode-solution/leetcode-0190-reverse-bits ,如果我的题解有错误,或者您有更好的解法,欢迎您告诉我 liweiwei1419@gmail.com 。