[位运算]leetcode190:点到二进制位(easy)

mac2022-06-30  29

题目: 题解:

解法1:用字符串保留数字n转换而成的二进制数字,由于数字n转换为二进制数字本身就是用低位到高位的,所以我们直接将转换而成的二进制数字直接添加到字符串尾部就行了,然后将字符串初始化bitset,最后利用函数to_ulong()返回bitset对应的32位无符号小数了。解法2:优化解法1,直接用数字n初始化bitset,然后判断从两端到中间两两相对的位是否相等,若相等,则不需要颠倒;若不相等,则需要颠倒,注意不能使用swap颠倒,因为库函数不支持,所以直接取反即可。解法3:二进制数的移位操作。

代码如下:

class Solution { public: //解法1:用bitset库,时间复杂度O(n),需要优化 uint32_t reverseBits_1(uint32_t n) { string result=""; while (n != 0) { result.append(to_string(n % 2)); n /= 2; } while (result.size() <= 32) { result.push_back('0'); } bitset<32> b(result); return (uint32_t)b.to_ulong(); } //优化解法1:采用折半的方法,将32位二进制数字从两端到中间判断是否需要颠倒,若数字不一样,则需要颠倒,相同就不需要颠倒了 //时间复杂度为O(n) uint32_t reverseBits(uint32_t n){ bitset<32> b(n); for(int i=0;i<16;++i) if(b[i]!=b[31-i]){b[i]=!b[i];b[31-i]=!b[31-i];} return b.to_ulong(); } //解法2:移位操作 uint32_t reverseBits_2(uint32_t n){ uint32_t result=0; int i=32; while(i--){ result<<=1; //左移一位,让n的最后一位有位置可占 result+=n&1; //取得n的最右边的二进制数字,去插入到result的尾部 n>>=1; //二进制数n的最后一位释放掉 } return result; } };
最新回复(0)