求二进制中1的个数

方法一:

    复杂度为O(1)

#include <bitset>
#include <iostream>
#include <climits>

size_t popcount(size_t n) {
  //CHAR_BIT表示一个字节的位数,用sizeof(size_t) * CHAR_BI位二进制表示十进制数n
std::bitset<sizeof(size_t) * CHAR_BIT> b(n);
return b.count();
}
int main() { std::cout << popcount(1000000);}

方法二:

    复杂度为O(1)

unsigned cppPopcount(unsigned bb)
{
#define C55 0x5555555555555555ULL
#define C33 0x3333333333333333ULL
#define C0F 0x0f0f0f0f0f0f0f0fULL
#define C01 0x0101010101010101ULL

    bb -= (bb >> 1) & C55;              // put count of each 2 bits into those 2 bits
    bb = (bb & C33) + ((bb >> 2) & C33);// put count of each 4 bits into those 4 bits
    bb = (bb + (bb >> 4)) & C0F;        // put count of each 8 bits into those 8 bits
    return (bb * C01) >> 56;            // returns left 8 bits of x + (x<<8) + (x<<16) + (x<<24) + ...
}

方法三:

    复杂度为O(logn):n为十进制输入

unsigned int v = value(); // count the number of bits set in v
unsigned int c; // c accumulates the total bits set in v
for (c = 0; v; c++)
{
  v &= v - 1; // clear the least significant bit set
}

    顺便介绍下c++中的模板类

template <size_t N> class bitset;

    1.bitset用于存储位(元素仅有两个可能的值:0或1,true或false)

    2.该类模拟一个布尔元素数组,但是对空间分配进行了优化:通常,每个元素仅占一位。

    3.每个位的位置可以被单独访问:例如,对于一个名为foo的给定bitset对象,表达式foo[2]访问它的第4位,就像常规数组访问元素一样,但是在大多数c++环境中没有元素类型是单一位的,所以单独元素被作为特殊引用类型访问

    4.bitset可有整数型或者二进制字符串构建或转换,也可以直接在二进制流中进行插入和读取。

    5.bitset的大小在编译时固定

    具体方法详见,点击打开链接

    更多有关二进制中1的个数的方法见:点击打开链接

     
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值