190. Reverse Bits
二进制操作,一直是自己比较薄弱的地方。
解法一:对每个二进制位进行操作
class ReverseBits {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t movement = n;
uint32_t res = 0;
int mask = 1;
for (int i = 0; i < 32; i++)
{
res = (res << 1) | (movement & mask);
movement = movement >> 1;
}
return res;
};
};
解法二(leetcode里面大神提供):
类似于归并排序的方法
以8个bit举例,编号为
1 2 3 4 5 6 7 8
一组:1 2 3 4
二组:5 6 7 8
进行下列步骤:
步骤1:翻转一组
1 2 3 4 —> 4 3 2 1
步骤2:翻转二组
5 6 7 8 —> 8 7 6 5
步骤3:一组和二组翻转
4 3 2 1 8 7 6 5 —> 8 7 6 5 4 3 2 1
这样可以实现把整个序列翻转
4个bit时也是一样的。所以此方法类似归并
class ReverseBits {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t x = n;
//奇数位与偶数位互换
x = ((x & 0x55555555) << 1) | ((x & 0xAAAAAAAA) >> 1);
x = ((x & 0x33333333) << 2) | ((x & 0xCCCCCCCC) >> 2);
x = ((x & 0x0F0F0F0F) << 4) | ((x & 0xF0F0F0F0) >> 4);
x = ((x & 0x00FF00FF) << 8) | ((x & 0xFF00FF00) >> 8);
x = ((x & 0x0000FFFF) << 16) | ((x & 0xFFFF0000) >> 16);
return x;
}
};
0x55555555 = 0101 0101 0101 0101 0101 0101 0101 0101
0xAAAAAAAA = 1010 1010 1010 1010 1010 1010 1010 1010
0x33333333 = 0011 0011 0011 0011 0011 0011 0011 0011
0xCCCCCCCC = 1100 1100 1100 1100 1100 1100 1100 1100