11.二进制中1的个数

题目描述

输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
 
思路1:
先判断最后一位是不是1 ,然后右移一位,再判断是不是1 
但是如果输入负数 就会进入死循环,因为负数多次右移之后会变成1111....111

所以正确的思路是 我们左移1,每次移动1位。
 
 1 public class Solution {
 2     public int NumberOf1(int n) {
 3         int count = 0;
 4         int flag = 1;
 5         while(flag!=0){
 6             if((flag & n)!=0)
 7                 count ++;
 8             flag = flag<<1;
 9         }
10         return count;
11     }
12 }

 思路2:

结论:

n-1与n按位与 , 会把n最右边一个变成 0.

统计一下一共变了几次,就有几个1.

 1 public class Solution {
 2     public int NumberOf1(int n) {
 3         int count = 0;
 4         while(n!=0){
 5                count ++;
 6                n=((n-1)&n);
 7                }
 8         return count;
 9     }
10 }
c++:20180807
 1 class Solution {
 2 public:
 3      int  NumberOf1(int n) {
 4       int cnt=0;
 5       for(int flag=1;flag!=0;flag=flag<<1)
 6          if(flag&n)
 7              cnt++;
 8          
 9       return cnt;
10      }
11 };
原文地址:https://www.cnblogs.com/zle1992/p/7801257.html