190. Reverse Bits

题目描述和难度

  • 题目描述:

颠倒给定的 32 位无符号整数的二进制位。

示例:

输入: 43261596
输出: 964176192
解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 ,
     返回 964176192,其二进制表示形式为 00111001011110000010100101000000 

进阶:
如果多次调用这个函数,你将如何优化你的算法?

思路分析

求解关键:这道题并不难,可以用字符串的方法来做,也可以用位运算的方法来做。

参考解答

参考解答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