C++题解 | #二进制中1的个数#

二进制中1的个数

http://www.nowcoder.com/practice/8ee967e43c2c4ec193b040ea7fbb10b8

此题思路较为巧妙。
若直接做右移位运算,则当为负数时,对其右移一位,为了保持负数,则其最左端会替换为1,而非正数的0。则继续进行右移,会导致最后负数变成0xFFFFF,故而要另寻出路。
将数据按照位数由低到高与1做与运算,若该位是1,与运算结果必为1.即1需要持续左移直到判断完毕,那么32位数据就需要做32次与运算。
最后考虑当数据减去1,最右边的第一个1会变成0,该位右边的0会变成1,而该位左边则不发生变化。且减去1后的数据,与原数据做与运算,则除了最右边的一个1会变成0外,其余位数字都不发生改变,且数据中有几个1就可以做几次这样的运算。(如1010,首先1010-1 = 1001,之后1010 & 1001 = 1000,即经过此番过程,1010最右边的1变为0)

class Solution {
public:
     int  NumberOf1(int n) {
         int i = 0;
         while (n) {
             ++i;
             n = n & (n - 1);
         }
         return i;
     }
};
全部评论

相关推荐

02-11 12:20
门头沟学院 Java
面试中的青提很胆小:我不信有比我们学校更逆天的,计算机专业就业第一位是我们学校二餐厅的打印店
点赞 评论 收藏
分享
Beeee0927:正确的建议
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务