Reverse Bits
原题链接Reverse Bits
给定一个32位无符号整型数,将它的二进制逆序,返回结果
从字符串的角度观察二进制逆序,只需要从两端开始两两交换即可。当然,完全可以不将二进制转为字符串,而是模拟字符串的逆序操作
代码如下
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = 0;
uint32_t first = (1 << 31);
uint32_t last = 1;
int diff = 31;
while(first > last)
{
res |= ((first & n) >> diff);
res |= ((last & n) << diff);
diff -= 2;
first >>= 1;
last <<= 1;
}
return res;
}
};
此外,利用std::bitset也可以解决本题
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
auto s = std::bitset<32>(n).to_string();
std::reverse(s.begin(), s.end());
return std::bitset<32>(s).to_ulong();
}
};
Number of 1 Bits
原题链接Number of 1 Bits
计算给定32位无符号整型数的二进制中1的个数,方法比较多
虽然本题明确指出n是无符号数,但是大多数问题中n都是可正可负
第一种方法,一位一位计算
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
/* 使用cnt作为循环次数的原因是n如果是负数,那么高位会全是1,导致无限循环 */
int cnt = 32;
while(cnt--)
{
if(n & 1)
++res;
n >>= 1;
}
return res;
}
};
如果n是负数,之所以会造成死循环是因为改变了n的值,导致右移时高位补1而不是补0
第二种方法,不移动n
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
uint32_t flag = (1 << 32);
while(flag)
{
if(n & flag)
++res;
flag >>= 1;
}
return res;
}
};
第三种方法,不移动n
class Solution {
public:
int hammingWeight(uint32_t n) {
int res = 0;
while(n)
{
++res;
n &= (n - 1);
}
return res;
}
};
最后一种方法,利用std::bitset
class Solution {
public:
int hammingWeight(uint32_t n) {
return std::bitset<32>(n).count();
}
};