获取二进制中1的个数

方法一使用位移操作
 
 
int NumberOf1(int n)
{
    int count = 0;
    while(n){
        if(n & 1){
            count++;
        }
        n = n >> 1;
    }
    return count;   
}

这种解法是将数据n每次右移一位和1进行&运算来求得二进制中1的个数,对于无符号数来说没有问题,可是对于有符号数问题就大了,极有可能造成死循环。当n为负数时,n右移在最高位补1(为了保证数据为负数),因而最终就会形成死循环。可以改为

int NumberOf1(int n)
{
    int count = 0;
    int temp=1;
    for(int i=0;i<32;i++)
    {
        if(n & temp){
            count++;
        }
        temp = temp << 1;
    }
    return count;   
}

方法二,使用一个性质:把一个整数减去1之后再和原来的整数做按位与,得到的结果相当于是把整数的二进制表示中最右边的一个1变成0

int NumberOf1(int n)
{
    int count = 0;
    while(n){
        count++;  //只要n不为0则其至少有一个1
        n = n & (n - 1);
    }
    return count;
}

猜你喜欢

转载自blog.csdn.net/u012863603/article/details/79361129