LeetCode-190-顛倒二進位制位

雄獅虎豹發表於2022-05-02

顛倒二進位制位

題目描述:顛倒給定的 32 位無符號整數的二進位制位。

提示:

  • 請注意,在某些語言(如 Java)中,沒有無符號整數型別。在這種情況下,輸入和輸出都將被指定為有符號整數型別,並且不應影響您的實現,因為無論整數是有符號的還是無符號的,其內部的二進位制表示形式都是相同的。
  • 在 Java 中,編譯器使用二進位制補碼記法來表示有符號整數。因此,在上面的 示例 2 中,輸入表示有符號整數 -3,輸出表示有符號整數 -1073741825。

示例說明請見LeetCode官網。

來源:力扣(LeetCode)
連結:https://leetcode-cn.com/probl...
著作權歸領釦網路所有。商業轉載請聯絡官方授權,非商業轉載請註明出處。

解法一:二進位制運算

將 n 視作一個長為 32 的二進位制串,從低位往高位列舉 n 的每一位,將其倒序新增到翻轉結果 result 中。程式碼實現中,每列舉一位就將 n 右移一位,這樣當前 n 的最低位就是我們要列舉的位元位。當 n 為 0 時即可結束迴圈。需要注意的是,在某些語言(如 Java)中,沒有無符號整數型別,因此對 n 的右移操作應使用邏輯右移。

說明:參考網上題解,原本的解法很笨。

public class LeetCode_190 {
    /**
     * 二進位制運算
     * 將 n 視作一個長為 32 的二進位制串,從低位往高位列舉 n 的每一位,將其倒序新增到翻轉結果 result 中。程式碼實現中,
     * 每列舉一位就將 n 右移一位,這樣當前 n 的最低位就是我們要列舉的位元位。當 n 為 0 時即可結束迴圈。需要注意的是,
     * 在某些語言(如 Java)中,沒有無符號整數型別,因此對 n 的右移操作應使用邏輯右移。
     *
     * @param n
     * @return
     */
    public static int reverseBits(int n) {
        int result = 0;

        for (int i = 0; i < 32 && n != 0; ++i) {
            result |= (n & 1) << (31 - i);
            n >>>= 1;
        }
        return result;
    }

    public static void main(String[] args) {
        int n = 43261596;
        // 測試用例,二進位制表示: 00000010100101000001111010011100
        System.out.println(Integer.toBinaryString(n));
        // 顛倒後二進位制表示: 00111001011110000010100101000000
        System.out.println(Integer.toBinaryString(reverseBits(n)));
    }
}
【每日寄語】 生命有裂縫,陽光才能照得進來。路上有坎坷,人才變得堅強起來。

相關文章