题意大概是就是标题所说,不过特别需要注意这里有一个坑,就是输入的整数也可能是负数,而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
原文链接: https://www.cnblogs.com/QingFengDaHui/p/12487872.html
欢迎关注
微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;
也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬
原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/335170
非原创文章文中已经注明原地址,如有侵权,联系删除
关注公众号【高性能架构探索】,第一时间获取最新文章
转载文章受原作者版权保护。转载请注明原作者出处!