链表中环的入口节点

剑指offer

Posted by chl on December 30, 2018

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。

解法

n个1循环n次; 对于二进制数来说,每次-1都会将最右边的1变为0,而1后面如果还有0的话,将会全部变为1;而如果最右边的1是最后一位,那么就这一位变为0; 如101001 -1 =>101000; 10100 -1 => 10011; 然后再和n自己与,如10100 & 10011 =》 10000 这样就去掉了最右边的一位1;从而可以将循环次数缩小为1的个数;

## 代码

class Solution {
public:
     int  NumberOf1(int n) {
         int cout = 0 ;
         while(n){
             cout++;
             n = (n-1)&n;
         }
         return cout;
     }
};