算法设计与分析课作业【week5】leetcode--190. Reverse Bits

题目

Reverse bits of a given 32 bits unsigned integer.

Example:

Input: 43261596
Output: 964176192
Explanation: 43261596 represented in binary as 00000010100101000001111010011100, 
             return 964176192 represented in binary as 00111001011110000010100101000000.

题目要求是将一个数的位表示进行颠倒,输出颠倒后的数。看到题目第一反应是位运算,但要怎么操作位呢,之前对位操作的题目做的很少,于是重新去学习了一下位运算符的操作后才逐渐找到了方向。

既然要求要反转位,那么我们的最后结果就一位一位的来拿,使原数不断右移,目标数不断左移,每次移动后拿到原数的第一位。

C++代码如下:

class Solution {
public:
    uint32_t reverseBits(uint32_t n) {
        uint32_t rev_num = 0, index = 32;
        while (index--) {
            // 目标数左移
            rev_num <<= 1;
            /* 
              原数与1相与留下最后一位,
              目标数再与其相或拿到最后一位
            */
            rev_num |= n & 1;
            // 原数右移
            n >>= 1;
        }
        return rev_num;
    }
};

刚开始做的时候,循环体的内容是这样的:

rev_num |= n & 1;
rev_num <<= 1;
n >>= 1;

即先相或取最后一位,再来分别移动,这样在运行到只剩下一位时是没有问题的,但到了最后一次取数之后,目的数已经出现了,接下来又走了一次左移,所以导致目的数出错。也希望读者注意一下。

思考后才找到了先移动目的数再取位的方式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值