190. 颠倒二进制位

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

示例:

输入: 43261596
输出: 964176192
解释: 43261596 的二进制表示形式为 00000010100101000001111010011100 ,
返回 964176192,其二进制表示形式为 00111001011110000010100101000000 。
进阶:
如果多次调用这个函数,你将如何优化你的算法?

方法一:
来看看大师写的代码,大家可以看下Java里面Integer包装类里面的reverse方法源码,我是有点看不懂…大家可以研究下

注意下:
>>> 和 <<< 在Java里面为无符号移位,c++的话需要转为无符号整数在运算
另外0x5555这种属于某些特定整数的16进制表示,这些整数的二进制形式很特殊,用16进制表示可以借助系统的计算器快速计算相应的二进制形式

public static int reverse(int i) {
        // HD, Figure 7-1
        i = (i & 0x55555555) << 1 | (i >>> 1) & 0x55555555;
        i = (i & 0x33333333) << 2 | (i >>> 2) & 0x33333333;
        i = (i & 0x0f0f0f0f) << 4 | (i >>> 4) & 0x0f0f0f0f;
        i = (i << 24) | ((i & 0xff00) << 8) |
            ((i >>> 8) & 0xff00) | (i >>> 24);
        return i;
    }
class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        n = (n & 0x55555555) << 1 | (n >> 1) & 0x55555555;
        n = (n & 0x33333333) << 2 | (n >> 2) & 0x33333333;
        n = (n & 0x0f0f0f0f) << 4 | (n >> 4) & 0x0f0f0f0f;
        n = (n << 24) | ((n & 0xff00) << 8) |
            ((n >> 8) & 0xff00) | (n >> 24);
        return n;
    }
};
class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        unsigned int  NO_OF_BITS = sizeof(n) * 8;
        unsigned int reverse_num = 0, i, temp;

    for (i = 0; i < NO_OF_BITS; i++)
    {
        temp = (n & (1 << i));
        if(temp)
            reverse_num |= (1 << ((NO_OF_BITS - 1) - i));
    }
 
    return reverse_num;
    }
};

时间复杂度:O(logn)
空间复杂度:O(1)
方法二:
保持reversenum每一位与给定num相等直到num变成0,之后反向移动剩余的位

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
      unsigned int count = sizeof(n) * 8 - 1;
      unsigned int reverse_num = n;
     
    n >>= 1; 
    while(n)
    {
       reverse_num <<= 1;       
       reverse_num |= n & 1;
       n >>= 1;
       count--;
    }
    reverse_num <<= count;
    return reverse_num;
    }
};

时间复杂度:O(logn)
空间复杂度:O(1)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值