温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

二进制中 1 的个数

发布时间:2020-06-20 20:55:43 来源:网络 阅读:280 作者:duanjiatao 栏目:编程语言

题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中 1 的个数。

例如: 9 表示成二进制是 1001, 有 2 位是 1 。因此如果输入 9 ,该函数输出 2 。


先看一种错误的解法:二进制中 1 的个数

二进制中 1 的个数

int NumberOf1(int n)
{
    int count = 0;
    while(n)
    {
        if(n & 1)
            count ++;

        n = n >> 1;
    }

    return count;
}

注意:在使用乘法或者除法的运算时,尽量使用移位运算代替,因为移位运算的效率要比乘除法高很多!

上述解法的问题在于:输入一个正数,结果没有问题,但是,如果输入一个负数的话,会发生什么情况?

我们知道,负数的二进制的最高位为 1 ,当进行右移操作时,最高位要补上符号位也就是 1 ,因此每右移一位,最高位就补 1 ,最终这个数字就会变成0xFFFFFFFF,而陷入死循环。

二进制中 1 的个数

常规解法

二进制中 1 的个数

二进制中 1 的个数

int NumberOf1_Solution1(int n)
{
    int count = 0;
    unsigned int flag = 1;
    while(flag)
    {
        if(n & flag)
            count ++;

        flag = flag << 1;
    }

    return count;
}

此解法中循环的次数等于整数二进制的位数,32位的整数需要循环32次。

高效的解法

二进制中 1 的个数

二进制中 1 的个数

int NumberOf1(int n)
{
    int count = 0;

    while (n)
    {
        ++ count;
        n = (n - 1) & n;
    }

    return count;
}

该解法在整数中有几个 1 就只需要循环几次。

相关题目二进制中 1 的个数

二进制中 1 的个数

二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数二进制中 1 的个数

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI