【题目】输入一个整数,输出该数二进制表示中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 }