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

tech2022-08-19  64

题目描述

颠倒给定的 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,如下所示,可以结合上面的过程进行理解。

最新回复(0)