剑指offer系列9--二进制中1的个数

【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。比如输入9,9的二进制表示是1001,1的个数是2,所以输出2。

【思路】第一种方法是从最右一位开始右移,并且判断该数是否为1统计,缺点是输入负数时会出现死循环;0x80000000>>1...会0xFFFFFFFF死循环
     第二种方法是与1相与并进行左移,如果为1则表示该位为1,缺点是循环次数较多;
     第三种方法是将该数减1,再和原整数做与运算,直至变为全0,统计这样的操作有多少次。(推荐)

 1 package com.exe2.offer;
 2 
 3 /**
 4  * 【题目】输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示。比如输入9,9的二进制表示是1001,1的个数是2,所以输出2。
 5  * 【思路】第一种方法是从最右一位开始右移,并且判断该数是否为1统计,缺点是输入负数时会出现死循环;0x80000000>>1...会0xFFFFFFFF死循环
 6  *             第二种方法是与1相与并进行左移,如果为1则表示该位为1,缺点是循环次数较多;
 7  *        第三种方法是将该数减1,再和原整数做与运算,直至变为全0,统计这样的操作有多少次。(推荐)
 8  *       
 9  * @author WGS
10  *
11  */
12 public class NumbersInBinarry {
13     //方法2
14     public  int numOf1(int n){
15         int count=0;
16         int temp=n;
17         int flag=1;
18         while(flag!=0){ 
19             n=temp&flag;
20             if(n!=0){
21                 ++count;
22                 
23             }
24             flag=flag<<1;
25         }
26         return count;
27         
28     }
29     //方法3
30     public int getNumOf1s(int n){
31         int count=0;
32         while(n!=0){
33             n=n&(n-1);
34             count++;
35         }
36         return count;
37         
38     }
39     public static void main(String[] args){
40         NumbersInBinarry n=new NumbersInBinarry();
41         //int num=n.numOf1(19);
42         int num=n.getNumOf1s(19);//3
43         System.out.println(num);
44     }
45 }
原文地址:https://www.cnblogs.com/noaman/p/5394272.html