算法学习十----整数的二进制表示中1的个数

来源:互联网 发布:php获取p标签中的img 编辑:程序博客网 时间:2024/04/28 01:17
题目:输入一个整数,求该整数的二进制表达中有多少个1。
例如输入10,由于其二进制表示为1010,有两个1,因此输出2。
这是一道考查位运算的题目,做位运算的时候一定要把负数也考虑进去,刚开始做的时候忘了考虑进去,结果输入一个负数的时候就彻底凌乱了。
刚开始的思路是先判断整数的最右边一位是不是1,然后把整数右移一位,这样,原来处于右边第二位的数字现在被移到第一位了,再判断是不是1。这样每次移动一位,直到这个整数变成0为止。
然后拿一个负数来举例子,如果把如数0x40000000一直做右移运算,最终这个数字就会变成0xFFFFFFFF而陷入死循环。
换一种思路,首先将数字n和flag=1做与运算,判断最低位是不是1,接着左移flag,这样可以判断判断次低位是不是1,反复左移,直到flag超出了int所能表示的范围。
算法实现的伪代码如下:


int count = 0;unsigned int flag = 1;while flag is in the unsigned int's scope     if countdown to the flag'th is 1          then add countshift flag to the left by 1

C++实现

int CountBinOne(int &n){    //define count and flag    int count = 0;    unsigned int flag = 1;    //while flag is in the unsigned int's scope    while(flag)    {        //if countdown to the flag'th is 1        if(n & flag)        {            //then add count            ++count;        }                //shift flag to the left by 1        flag = flag << 1;    }    return count;}


0 0
原创粉丝点击