1. 程式人生 > >LeetCode:190. 顛倒二進位制位(C++)

LeetCode:190. 顛倒二進位制位(C++)

題目:

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

示例:

輸入: 43261596
輸出: 964176192
解釋: 43261596 的二進位制表示形式為 00000010100101000001111010011100 ,
     返回 964176192,其二進位制表示形式為 00111001011110000010100101000000 。

進階:
如果多次呼叫這個函式,你將如何優化你的演算法?

解答:

可以這麼做:

新建一個變數,

把原數的第1位賦值給新數的第32位;

把原數的第2位賦值給新數的第31位;

……

把原數的第32位賦值給新數的第1位;

實現:

我們可以通過n & 1得到n的最後一位, 然後將n向右移一位,再來一次n & 1,於是得到原來n的第二位……

如果對新的變數進行左移,那麼可以把原來新變數的最後一位移至第二位, 第三位……一直到最高位。

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t result = 0;
        for (int i = 0; i < 32; i++) {
            result <<= 1;
            result = result | (n & 1); /*這裡把n的最後一位加到result的最後一位,
注意到上一個result前面的位是不能動的,於是用一個按位或更新result*/
            n >>= 1;
        }
        return result;
    }
};