确定一个整数的计算机内部表示中有几个"1"

面试常见题:C程序:确定一个整数的计算机内部表示中有几个"1"

注意不断右移判断最低位是1有多少个的算法是错误的,
因为根据GNU C/C++的实现来看,负数是带符号填充进行右移的,所以如果是负数,该算法会死循环。
变通办法:Java可以用>>>逻辑右移位操作符,C/C++可以强制转换成无符号整数再处理
下面的程序是正解。其中num &= (num - 1) 会消除num的最小位置的"1"

#include <stdio.h>

int numOnesInBinary(int num)
{
    
int numOnes = 0;
    
while (num != 0) {
        num 
&= (num - 1);
        numOnes
++;
    }
    
return numOnes;
}

int main()
{
    printf(
"%d", numOnesInBinary(-1));
    
return 0;
}

posted on 2009-03-13 13:34  庄冠华  阅读(240)  评论(0编辑  收藏  举报

导航