如何判断整数x的二进制中含有多少个1

来源:互联网 发布:莫扎特 知乎 编辑:程序博客网 时间:2024/05/16 08:12

主要是利用位操作来判断每一位是否为1

方法一:

清除整数a最右边的1可以使用这个操作:a&(a-1)

 所以可以利用这个方法来得到1的个数:

复制代码
int count_one(unsigned x){
    int count=0;
    while(x){
        count++;
        x=x&(x-1);
    }
    return count;
}
复制代码

方法二:

对整数进行移位,然后判断最后一位是否为1

复制代码
int count_one2(unsigned x){
    int count=0;
    int i=0;
    while(i<32){
        if((x>>i)&0x1)
            count++;
        i++;
    }
    return count;
}
复制代码

方法三:

这个方法和方法二类似,只是每次移动4位。 

复制代码
int count_one3(unsigned x){
    static const int hex[]={0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};
    int count=0;
    int i=0;
    while(i<8){
        count+=hex[(x>>(i*4))&0xf];
        i++;
    }
    return count;

}
复制代码

下面是测试程序:

复制代码
int main(){
    int n=20;
    for(int i=0;i<n;i++){
        unsigned val=rand()%100;
        int c1=count_one(val);
        int c2=count_one2(val);
        int c3=count_one3(val);
        cout<<val<<" "<<c1<<" "<<c2<<" "<<c3<<endl; 
    }
}
复制代码

 具体执行结果如下: 


0 0