位1的个数
方法1
循环检查二进制位每一位是否为1。第i位与2^i进行与运算。
2^i 用左移操作来表示。 需要循环32次
class Solution {
public:
int hammingWeight(uint32_t n) {
int i = 0, count = 0;
while(i < 32) {
if (n & (1 << i)) {
count++;
}
i++;
}
return count;
}
};
方法2
利用位运算的性质。
n&(n - 1) 运算结果恰为把 n 的二进制位中的最低位的 1变为 0 之后的结果
不断的迭代直到n为0。
class Solution {
public:
int hammingWeight(uint32_t n) {
int ret = 0;
while (n) {
n &= (n - 1);
ret++;
}
return ret;
}
};
2的幂
判断一个数是否是2的幂 其二进制位中有且仅有1个1
class Solution {
public:
bool isPowerOfTwo(int n) {
return n > 0 && !(n & (n - 1)); // 题目给定n为整数了 n肯定大于0
}
};
颠倒二进制位
每次把res左移,把n的二进制末尾数字拼接到res的末尾。然后n右移。
n的二进制末尾数字就是n&1.
class Solution {
public:
uint32_t reverseBits(uint32_t n) {
uint32_t res = 0;
for (int i = 0; i < 32; i++) {
res = (res << 1) | (n & 1);
n = n >> 1;
}
return res;
}
};
比特位计数
奇数:二进制中1的个数比其前面的偶数多1
偶数:二进制中1的个数与该数的一半的数中的1的个数一致
0: 0
class Solution {
public:
vector<int> countBits(int num) {
vector<int> result(num + 1);
result[0] = 0;
for (int i = 1; i <= num; i++) {
if (i & 1 == 1) {
result[i] = result[i >> 1] + 1;
} else {
result[i] = result[i >> 1];
}
}
return result;
}
};