整数的二进制表示中1的个数(位运算)

给出一个整数,输出它的二进制表示中1的个数。

测试用例:

正数:边界值1,0x7FFFFFFF

负数:边界值0x80000000,0xFFFFFFFF

零:0

int numbersof1_1(int num)
{
    int sum=0;
    
    while(num)
    {
        if(num&1)
            ++sum;
            
        num>>=1;
    }
    
    return sum;
}

上面的解法可能引起死循环,对于负数,因为负数右移是删除二进制右边一位,然后左边加1,最后导致0xFFFFFFFF的死循环。另外,位运算就是相当于乘以2,除以2的运算,但是位运算的效率高于乘法运算。

int numbersof1_2(int num)
{
    int sum=0;
    int f=1;
    
    while(f)
    {
        if(num&f)
            ++sum;
            
        f<<=1;
    }
    
    return sum;
}

这是常规解法,通过对1左位移,避免了对整数的操作引起死循环,在循环了32次或64次(根据电脑位数决定)后循环结束。

int numbersof1_3(int num)
{
    int sum=0;
    
    while(n)
    {
        num=num&(num-1);
        ++sum;
    }
    
    return sum;
}

上面的是较优解法,举例说明,对于数1100,将它减1,得到1011,发现最右边的1变为了0,如果原来后边存在0,则全变为1,再将1011和它本身1100做与运算得到1000,发现相较于原数,最右边的1变为了0,记录下来,令sum++,知道整数为0结束。

你可能感兴趣的:(剑指offer)