一、问题描述

给定一个数n ,求该数转换成二进制后包含的1 的个数。

二、代码实现

非常老也是非常经典的一个面试题,第一次面试的时候就遇到了,这里只要把nn-1 循环按位与就可以了。

# include <stdio.h>
int main(){
    int n, cnt;
    while(scanf("%d", &n) != EOF){
        cnt = 0;
        while (n){
            cnt ++;
            n = n & (n - 1);
        }
        printf("%d", cnt);
    }
    return 0;
}

三、变形

题目非常老,经常会被变形。例如把该过程封装成一个函数,然后传入参数,求输出值。

# include <stdio.h>
int f(int x){
    int cnt = 0;
    while (x){
        cnt ++;
        x = x & (x - 1);
    }
    return cnt;
}
int main(){
    printf("%d", f(9999));
    return 0;
}

这里输出的就是9999的二进制中1的个数8。

最后修改:2018 年 01 月 13 日
喜欢就给我点赞吧