【LeetCode-190】 Reverse Bits(C++)

博客介绍了如何使用C++解决LeetCode的190题,即反转32位无符号整数的二进制位。作者分享了三种解题方法,包括原始的转换为二进制数组再反转的思路,以及两种利用位运算优化的解决方案,重点讲解了位运算的巧妙运用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目要求:要求将一个32位无符号整数所对应的二进制位反转得到的无符号整数。

解题思路:一般这种对应于二进制位的题目要考虑位运算!!而我可能对于位运算不太熟悉,每次都是用最愚蠢的办法做,虽然AC了,但是看了别人的解决方法才觉得自己好蠢,一开始我的想法就是将32位无符号整数化为二进制,存到一个含有32个元素的数组里,然后再反着计算。真是太傻了!!!!代码1,我就不多说了,随便看看应该就能看懂。

考虑位运算的方法是看了别人的解题思路写出来的,基本思想就是首先令fool=0,取得n的最后一位与fool相或,这个时候fool里面存的即使n的最后一位,然后将fool左移一位,这时n的最后一位变成了fool的第一位,并且fool的最后一位为0。将n右移一位,这时原来n的倒数第二位就成了现在的倒数第一位,取出这一位,然后与fool相与,这时fool的最后一位存的是n中的倒数第二位……,循环下去直到n的第一位被存到fool的最后一位中。当然这种方法的for循环中有很多种实现方法,可以每次右移n,也可以设置一个mask,每次左移mask。mask的作用是取得n的相应位,然后再右移。然后再与fool相与。

最后一种方法,真的是太神奇了!没有用到循环,具体思路见代码3注释。

代码实现:

1.

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        int a[32];
        int i=0;
        uint32_t result=n;
        uint32_t s=0;
        while(result!=0){
            s=result%2;
            result/=2;
            a[i]=s;
            i++;
        }
        for(int j=i;j<32;j++)
            a[j]=0;
        uint32_t sum=0;
        for(int k=0;k<32;k++){
            sum+=a[k]*pow(2,(31-k));
        }
        return sum;
    }
};
2.1
class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t fool=0;
        for(int i=0;i<32;i++){                                
            fool=(fool<<1)|(n&0x01);                          
            n=n>>1;                 //for中的两句也可以合成一句 fool=(fool<<1)|((n>>i)&0x01);                           
        }
        return fool;
    }
};

2.2

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t fool=0;
        uint32_t mask=1;
        for(int i=0;i<32;i++){
            fool=(fool<<1)|((n&mask)>>i);
            mask=mask<<1;                //当然for中的两句同样也可以合成一句 fool=(fool<<1)|((n&(mask<<i))>>i)
        }
        return fool;
    }
};

3.
class Solution {
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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值