【位运算】颠倒二进制位/C++/Leedcode/源码

190. 颠倒二进制位

颠倒给定的 32 位无符号整数的二进制位。

方法一

将二进制数按位逆序输入到另一个二进制数中。

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t num = n; //源二进制数
        uint32_t res = 0; //目标二进制数
        for(int i = 0; i < 32; i++){  //逆序输入
            res <<= 1;     //目标二进制数左移
            res += num%2;  //按位放入目标二进制数
            num >>= 1;     //源二进制数右移
        }
        return res;
    }
};

方法二

连续换位。
这个方法比较好的是巧妙的运用了数运算的与和或进行“位选择”再组装。试用&(与)进行二进制位选择,再试用 | (或)进行组装。

public class Solution {
    public uint32_t reverseBits(int n) {
        uint32_t res = n;
        // 交换前后16位
        res = (res >> 16) | (res << 16);
        // 在每个16位中再交换8位
        res = ((res & 0xff00ff00) >> 8) | ((res & 0x00ff00ff) << 8);
        // 在每个8位中再交换4位
        res = ((res & 0xf0f0f0f0) >> 4) | ((res & 0x0f0f0f0f) << 4);
        // ... 1100110011001100...          0011001100110011...
        res = ((res & 0xcccccccc) >> 2) | ((res & 0x33333333) << 2);
        //     1010101010101010...          0101010101010101...
        res = ((res & 0xaaaaaaaa) >> 1) | ((res & 0x55555555) << 1);
        return res;
    }
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值