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

浙公网安备 33010602011771号