Reverse Bits

1.第一次看到这个题的时候,觉得就应该是把左右俩边对称的bit位调换一下位置。

  (1)如果对称的俩个bit位,值是一样的话,就不用变。

  (2)否则就把相应的bit位,各自取反。

2.取出对称的bit位。

因为有0--31个bit位,所以只要声明一个table[]数组,里面存着对应位为1的数字就可以了。

unsigned int table[] = 
    {
      1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304,8388608,16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648,
    };

然后就是取出各自对称的bit位了:

bool left = (n & table[i]) >> i; //取出第I位bit
bool right = (n & table[31 - i]) >> (31 - i); //取出第I位对称的(31-I)位的bit

3.Accept代码:

class Solution {
public:
    unsigned int table[] = 
    {
      1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 2048, 4096, 8192, 16384, 32768, 65536, 131072, 262144, 524288, 1048576, 2097152, 4194304,8388608,16777216, 33554432, 67108864, 134217728, 268435456, 536870912, 1073741824, 2147483648,
    };

    unsigned int  reverseBits(unsigned int  n) {
        if (0 == n)
        {
            return 0;
        }
        
        for (int i = 0; i < 16; i++)
        {
            bool left = (n & table[i]) >> i;//取出第I位bit
            bool right = (n & table[31 - i]) >> (31 - i);//取出第I位对称的(31-I)位的bit
            if (left == right)//对称的bit位相等,直接跳过
             {
                continue;
            }
            else//否则,就各自取反
             {
                if (0 == left)
                {
                    n = n | table[i];
                    n = (n & (~table[31 - i]));
                }
                else 
                {
                    n = (n & (~table[i]));
                    n = n | table[31 - i];
                }
            }
        }

        return n;
    }
};
posted @ 2015-03-09 21:51  露天坝  阅读(105)  评论(0)    收藏  举报