首页 > 其他 > 详细

二进制中 1 的个数

时间:2016-07-06 18:46:46      阅读:271      评论:0      收藏:0      [点我收藏+]

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

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


先看一种错误的解法:技术分享

技术分享

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

        n = n >> 1;
    }

    return count;
}

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

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

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

技术分享

常规解法

技术分享

技术分享

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次。

高效的解法

技术分享

技术分享

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

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

    return count;
}

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

相关题目技术分享

技术分享

技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享技术分享

本文出自 “11408774” 博客,请务必保留此出处http://11418774.blog.51cto.com/11408774/1796584

二进制中 1 的个数

原文:http://11418774.blog.51cto.com/11408774/1796584

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!