190. Reverse Bits

仅供自己学习

 

思路:

通过每次n和1相与获得最低位,然后将其左移到31-i位,在将n右移一位更新最低为,这样就能翻转过来了。

代码:

 1 class Solution {
 2 public:
 3     uint32_t reverseBits(uint32_t n) {
 4         uint32_t rev=0;
 5         for(int i=0;i<32;++i){
 6             rev |= (n&1)<<(31-i); //n&1获得n当前最低位,然后把这个最低位左移到31-i的位置,rev与这个相或就能在rev添加这个新位的元素了
 7             n=n>>1;
 8         }
 9         return rev;
10     }
11 };

 

另一种方法分治。如下解释:

 

代码:

 1 class Solution {
 2 private:
 3     const uint32_t M1 = 0x55555555; //取一个位,取奇数
 4     const uint32_t M2 = 0x33333333; //每次取两个位
 5     const uint32_t M3 = 0x0f0f0f0f; //每次取四个位
 6     const uint32_t M4 = 0x00ff00ff; //每次取八个位
 7 public:
 8     uint32_t reverseBits(uint32_t n) {
 9         n = (n&(M1<<1))>>1 | (n&M1)<<1;  //n&(M1<<1) 获取偶数位,(n&M1)获奇数位
10         n = (n&(M2<<2))>>2 | (n&M2)<<2;//每次取两个位
11         n = (n&(M3<<4))>>4 | (n&M3)<<4;
12         n = (n&(M4<<8))>>8 | (n&M4)<<8;
13         return n<<16|n>>16;
14     }
15 };

 

posted @ 2021-03-29 10:11  Mrsdwang  阅读(28)  评论(0)    收藏  举报