#include <iostream>
using namespace std;
class Solution {
public:
// 方法1: Brian Kernighan 算法
int countBits1(uint64_t n) {
int count = 0; // 初始化计数器
while (n) { // 当n不为0时循环
n &= (n - 1); // 清除最右边的1
count++; // 每次清除一个1后计数器加1
}
return count; // 返回1的个数
}
// 方法2: 查找表法
int countBits2(uint64_t n) {
static const int table[256] = {
// 预计算每个字节(0-255)中1的个数
// 省略具体内容,假设已经填充完毕
};
// 返回每个字节对应的1的个数之和
return table[n & 0xff] +
table[(n >> 8) & 0xff] +
table[(n >> 16) & 0xff] +
table[(n >> 24) & 0xff] +
table[(n >> 32) & 0xff] +
table[(n >> 40) & 0xff] +
table[(n >> 48) & 0xff] +
table[(n >> 56) & 0xff];
}
// 方法3: 并行位计数
int countBits3(uint64_t n) {
n = n - ((n >> 1) & 0x5555555555555555); // 计算每两个bit中的1的个数
n = (n & 0x3333333333333333) + ((n >> 2) & 0x3333333333333333); // 计算每四个bit中的1的个数
n = (n + (n >> 4)) & 0x0f0f0f0f0f0f0f0f; // 计算每八个bit中的1的个数
return (n * 0x0101010101010101) >> 56; // 计算所有字节中1的总数
}
};
int main() {
Solution sol;
uint64_t num = 0b11011010; // 二进制表示的整数
int onesCount = sol.countBits1(num); // 调用方法1计算1的个数
cout << "二进制数 " << num << " 中1的位数是:" << onesCount << endl; // 输出结果
return 0; // 返回0表示程序正常结束
}