关闭

【剑指offer】面试题10: 二进制中1的个数

标签: 面试题二进制
216人阅读 评论(0) 收藏 举报
分类:

题目

实现一个函数,输入一个整数,输出该数二进制表示中1的个数。
例如9的二进制表示为1001,输入9,输出的结果是2.

其实自己来说并不太喜欢这种二进制游戏,但是也是自己的弱项,还是跟着书上分析一下。

首先,数字在计算机内部存储本身就是二进制,我们在做运算的时候,不用傻傻的写一个函数将十进制转换成二进制了。

右移,可能导致死循环(右移补符号位)

int NumOf1(int n) {
    int cnt = 0;
    while(n) {
        if (n & 1)  cnt++;
        n = n >> 1;
    }
    return cnt;
}

转换思路,n不变,flag左移没有符号位的限制,由于是int类型的n,flag左移31次

int NumOf1(int n) {
    int cnt = 0;
    int flag = 1;
    for (int i = 0; i < 32; i ++) {
        if (flag & n)   cnt++;
        flag = flag << 1;
    }
    return cnt;
}

取巧的解法:
一个数减1之后,最右边的1变为0,最右边1之后的0全部变为1,所以n和n-1做与运算,如果n中有1,结果就不为0。同时结果也变为去掉n中最右边的1的数。

int NumOf1(int n) {
    int cnt = 0;
    while(n) {
        cnt++;
        n = n & n-1;
    }
    return cnt;
}

神思路,虽然我觉得临场不可能创造出这么好的算法,但是有个印象,知道这样的题目,在特定的情况下有这么一种解法,也算是扩宽思路。

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:43976次
    • 积分:1391
    • 等级:
    • 排名:千里之外
    • 原创:85篇
    • 转载:23篇
    • 译文:0篇
    • 评论:11条
    联系方式

    微信:ilovevb23

    邮箱:geek00021@gmail.com

    最新评论