题一:【二进制中1的个数】
输入一个整数n,输出该数二进制表示中1的个数。其中负数用补码表示。
分析:常规解法:n的二进制每次和flag做与运算 =》查看当前位是否为1,如果是count++,然后将flag左移一位。
1 public class Solution {
2 public int NumberOf1(int n) {
3 int count=0;
4 int flag=1;
5 while(flag!=0){
6 if((n&flag)!=0){
7 count++;
8 }
9 flag = flag<<1;;
10 }
11 return count;
12 }
13 }
分析:巧妙解法--我们发现把一个整数减去一,都是把二进制最右边的1变成0.如果他的右边还有0,则所有的0变为1,而他的左边的所有未都保持不变。接下来我们把一个整数和他减去1的结果做与运算,相当于把他的最右边的1变成0。
1 public class Solution {
2 public int NumberOf1(int n) {
3 int count=0;
4 while(n!=0){
5 n=n&(n-1);
6 count++;
7 }
8 return count;
9 }
10 }