给定一点32位或者64位的二进制,如何有效的数出其中为1的数量 c++

#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表示程序正常结束
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值