LeetCode算法入門 顛倒二進制位 解法與分析

問題描述:

顛倒給定的 32 位無符號整數的二進制位。

示例 1:

輸入: 00000010100101000001111010011100
輸出: 00111001011110000010100101000000
解釋: 輸入的二進制串 00000010100101000001111010011100 表示無符號整數 43261596,
      因此返回 964176192,其二進制表示形式爲 00111001011110000010100101000000。

示例 2:

輸入:11111111111111111111111111111101
輸出:10111111111111111111111111111111
解釋:輸入的二進制串 11111111111111111111111111111101 表示無符號整數 4294967293,
      因此返回 3221225471 其二進制表示形式爲 10101111110010110010011101101001。

提示:

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

進階:
如果多次調用這個函數,你將如何優化你的算法?

解法一:

想不到,看了看力扣的大佬回答:

思路:此題只需要採用位運算,每次將原來的數字向左移動1位,就需要把該末尾加到我們的數字中去即可,此題需要注意的是一點要循環32次,不僅是有32位,最重要的不能判斷到原來的數字爲0就結束循環,這樣就有可能的導致沒有補足0所以要循環32次。

同時對於左移而言,末尾全部補上的是0,而對於右移而言左邊補的是原本最高位的數字,比如一個32位的數字最高位(也就是符號位)爲1就全部補上1,如果爲0 就全部補上0.這個知識點也是面試常考的。

代碼如下:

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t result = 0;
        for(int i = 0 ; i < 32; i++){
            result = result << 1;
            result = result + (n&1);//此處一定要加括號,因爲&的運算等級很低
            n = n >> 1;
        }
        return result;
    }
};

作者:vailing
鏈接:https://leetcode-cn.com/problems/reverse-bits/solution/zuo-you-yi-dong-by-vailing/
來源:力扣(LeetCode)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章