LeetCode 190. 颠倒二进制位

LeetCode 190. 颠倒二进制位

题目

在这里插入图片描述

题解

  • 位运算

与运算:
(1)清零。如果想将一个单元清零,即使其全部二进制位为0,只要与一个各位都为零的数值相与,结果为零。
(2)取一个数中的指定位置数值。找一个数,对应X要取的位,该数的对应位为1,其余位为零,此数与X进行“与运算”可以得到X中的指定位。

或运算:
(1)常用来对一个数据的某些位,置1。
二进制运算里 或运算 等价于 没有进位的加法运算
在这里插入图片描述

  • 分治

代码

// class Solution {
// public:
//     uint32_t reverseBits(uint32_t n) {
//         int res=0;
//         for(int i=0;i<32;i++){
//             res<<=1;
//             res+=n&1;
//             n>>=1;
//         }
//         return res;
//     }
// };

// class Solution {
// public:
//     uint32_t reverseBits(uint32_t n) {
//         uint32_t res = 0;
//         for (int i = 0; i < 32; ++i) {
//             res = (res << 1) | (n & 1);
//             n >>= 1;
//         }
//         return res;
//     }
// };

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        n = (n >> 16) | (n << 16); //低16位与高16位交换
        n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8); //每16位中低8位和高8位交换; 1111是f
        n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4); //每8位中低4位和高4位交换;
        n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2); //每4位中低2位和高2位交换; 1100是c,0011是3
        n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1); //每2位中低1位和高1位交换; 1010是a,0101是5
        return n;
    }
};

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值