1. 程式人生 > >LeetCode演算法題190:顛倒二進位制解析

LeetCode演算法題190:顛倒二進位制解析

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

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

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

這個題第一個想法就是逐位判斷1或0然後新增到新數中,那就產生了簡單的想法,首先判斷原數的低位,如果為1,那麼就對新數加1然後左移,如果為0,那麼新數直接左移,然後原數右移,但是這樣最後會多移一步,所以需要簡單處理。python程式如下:
python3原始碼:

class Solution:
    # @param n, an integer
    # @return an integer
    def reverseBits(self, n):
        result = 0
        for i in range(32):
            result = (result << 1) + (n & 1)
            n = n >> 1
        return result

有一種更厲害的解法,其原理如下解釋:
abcdefgh -> efghabcd -> ghefcdab -> hgfedcba
所以8位只需要交換3次,其運算複雜度是O(logn)。
C++原始碼:

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        n = (n << 16) | (n >> 16);
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);
        n = ((n & 0xcccccccc) >>
2) | ((n & 0x33333333) << 2); n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1); return n; } };