题目描述
输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。
思路1:
先判断最后一位是不是1 ,然后右移一位,再判断是不是1
但是如果输入负数 就会进入死循环,因为负数多次右移之后会变成1111....111
所以正确的思路是 我们左移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 };