面试题——二进制中1的个数

来源:互联网 发布:创建视图的sql语句代码 编辑:程序博客网 时间:2024/05/01 09:13

题目:
实现一个函数,输入一个整数,输出该数的二进制表示中1的个数。 例如把9表示成二进制是1001, 有两位是1。 因此如果输入9,该函数输出2。

考察的是位运算, 位运算一些基本操作:
与(&), 或(|),异或(^), 左移<<, 右移>>
code:

#include <stdio.h>int NumberOf1_Solution1(int n){    int count = 0;    unsigned int flag = 1;    while(flag)    {        if(n & flag)            count ++;        flag = flag << 1;    }    return count;}int NumberOf1_Solution2(int n){    int count = 0;    while (n)    {        ++ count;        n = (n - 1) & n;    }    return count;}void Test(int number, unsigned int expected){    int actual = NumberOf1_Solution1(number);    if(actual == expected)        printf("Solution1: Test for %p passed.\n", number);    else        printf("Solution1: Test for %p failed.\n", number);    actual = NumberOf1_Solution2(number);    if(actual == expected)        printf("Solution2: Test for %p passed.\n", number);    else        printf("Solution2: Test for %p failed.\n", number);    printf("\n");}int main(){    // 输入0,期待的输出是0    Test(0, 0);    // 输入1,期待的输出是1    Test(1, 1);    // 输入10,期待的输出是2    Test(10, 2);    // 输入0x7FFFFFFF,期待的输出是31    Test(0x7FFFFFFF, 31);    // 输入0xFFFFFFFF(负数),期待的输出是32    Test(0xFFFFFFFF, 32);    // 输入0x80000000(负数),期待的输出是1    Test(0x80000000, 1);    return 0;}
0 0