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

计算一个整数二进制表示中1的个数(剑指)

时间:2020-03-13 18:49:17      阅读:49      评论:0      收藏:0      [点我收藏+]

标签:因此   一个   return   题意   bsp   不能   class   turn   标题   

题意大概是就是标题所说,不过特别需要注意这里有一个坑,就是输入的整数也可能是负数,而C++负数表示为高位全部为1,如-2表示为111...10(32位),所以如果输入-2,输出1的个数为31。

因此我们肯定不能简单地右移n,这会导致左边高位不断补1,最后陷入死循环(负数不断右移不会为0)

第一种办法:

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

这个需要循环32次,因为unsigned int为32位

第二种办法

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

我们知道一个数减去1与原数进行与操作会将该数的最右边一位1变为0,如1100-1=1011,1100&1011=1000

 

计算一个整数二进制表示中1的个数(剑指)

标签:因此   一个   return   题意   bsp   不能   class   turn   标题   

原文地址:https://www.cnblogs.com/QingFengDaHui/p/12487872.html

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