leetcode190颠倒二进制位题目概念补充+非常详细的解释

题目描述

颠倒给定的 32 位无符号整数的二进制位。
示例 1:
输入: 00000010100101000001111010011100
输出: 00111001011110000010100101000000
解释: 输入的二进制串 00000010100101000001111010011100 表示无符号整数 43261596,
因此返回 964176192,其二进制表示形式为 00111001011110000010100101000000。

示例 2:
输入:11111111111111111111111111111101
输出:10111111111111111111111111111111
解释:输入的二进制串 11111111111111111111111111111101 表示无符号整数 4294967293,
因此返回 3221225471 其二进制表示形式为 10111111111111111111111111111111 。

通过代码

class Solution {
    
    
public:
    uint32_t reverseBits(uint32_t n) {
    
    
        uint32_t ans=0;
        int i=32;
        while(i--)
        {
    
    
            ans<<=1;//ans左移一位
            ans+=n&1;//将n的最低位加到ans的最低位
            n>>=1;//n右移一位
        }
        return ans;
    }
};

解题思路

这种二进制的题目之前没怎么做过,所以记录一下。刚开始都没有读懂代码。在网上查了查一些基本的东西,首先是uint32_t,其实它不是一个新的数据类型,它就相当于是int,在操作系统中其实是这样定义的,typedef unsigned int uint32_t。因为int是4字节,所以这个别名里面有32,表明是4字节,32位。uint8_t就是char,一个字节;uint16_t就是short,两个字节;uint64_t就是long long,8个字节。
<<是左移操作符,>>是右移操作符。左移的时候是将32位的二进制全部往左移一位,此时需要在最低位补0,比如1(01)左移一位就是2(10);右移的时候是将32位的二进制全部往右移一位,此时需要在最高位补数字,如果是无符号数或者是正数就补0,如果是负数就补1(因为正数转成二进制符号位是0,负数转成二进制符号位是1),比如3(11)右移一位就是3(01)。
所以这个题目应该是对输入n不断的右移,对结果ans不断的左移。只有n不断右移才能保证n的每一位在不同的循环层位于最低位,只有ans不断的左移才能保证最低位一直可以空出来并且为0,这样执行ans+=n&1;就可以将n的每一位加到ans的最低位,实现最终的颠倒。
下面是我自己理解的时候画的一张图,就是以这个题目的第一个示范输入作为输入。n其实在每次移位时都会在最高位补0,这里我就没有补0了,因为高位的0反正也不影响最后int的值。
在这里插入图片描述
在ide中运行,输出每一层的i,ans和n,如下所示,可以结合上面的过程进行理解。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_38391210/article/details/108372061