1. 程式人生 > >LeetCode 題解之 190. Reverse Bits

LeetCode 題解之 190. Reverse Bits

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);
    }
}