题一:【二进制中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 }
原文:https://www.cnblogs.com/qmillet/p/12021623.html