Monday, March 30, 2015

Reverse Bits

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

for 8 bit binary number abcdefgh, the process is as follow:
abcdefgh -> efghabcd -> ghefcdab -> hgfedcba




method 2


The idea is to check the 32 bits one by one from left to right. We will get final result after we finish that loop with 32 times. In each loop, we will always do 3 things:

1. The final result multiply by 2

2. If the modular of original value(n) is 1, then final result add 1.

3. Make the original value divided by 2.


The code is as follow:

    uint32_t reverseBits(uint32_t n) {
        uint32_t res = 0;
        for(int i = 0; i < 32; ++i)
        {
            res = res << 1;
            if(1 == n%2)
                ++res;
            n >>= 1;
        }
        return res;        
    }

No comments:

Post a Comment