码迷,mamicode.com
首页 > 其他好文 > 详细

二进制中 1 的个数

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

标签:二进制中 1 的个数

题目描述:请实现一个函数,输入一个整数,输出该数二进制表示中 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 的个数

标签:二进制中 1 的个数

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!