LeetCode 190. Reverse Bits

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值