1、题目描述
输入一个整数,输出该数二进制表示中 1 的个数。其中负数用补码表示。
2、代码
package com.ypj.java;
public class NumberOfOne {
/**
* 方法1:整数转字符串
* @param n
* @return
*/
public static long numberOfOne(int n){
String str = Integer.toBinaryString(n);
char arr[] = str.toCharArray();
long count = 0;
for(int i=0;i<arr.length;i++){
if(arr[i] == '1'){
count ++;
}
}
return count;
}
/**
* 方法2:
* @param n
* @return
*/
public static int numberOfOne1(int n){
int count = 0;
if(n < 0){
n = n & 0x7FFFFFFF;
count ++;
}
while(n != 0){
if(n % 2 == 1){
count ++;
}
n = n / 2;
}
return count;
}
/**
* 方法3:
* @param n
* @return
*/
public static int numberOfOne2(int n){
int count = 0;
if(n < 0){
n = n & 0x7FFFFFFF;
count ++;
}
while(!(n==0)){
if((n & 1)==1){
count ++;
}
n = n >> 1;
}
return count;
}
/**
* 方法4:
* @param n
* @return
*/
public static int numberOfOne3(int n){
int count = 0;
while(n != 0){
n = n & (n-1);
count ++;
}
return count;
}
public static void main(String[] args) {
long t1 = System.nanoTime();
System.out.println(numberOfOne(7));
long t2 = System.nanoTime();
System.out.println(numberOfOne1(7));
long t3 = System.nanoTime();
System.out.println(numberOfOne2(7));
long t4 = System.nanoTime();
System.out.println(numberOfOne3(7));
long t5 = System.nanoTime();
long t21 = t2 - t1;
long t32 = t3 - t2;
long t43 = t4 - t3;
long t54 = t5 - t4;
System.out.println("方法1:"+t21+"ns");
System.out.println("方法2:"+t32+"ns");
System.out.println("方法3:"+t43+"ns");
System.out.println("方法4:"+t54+"ns");
}
}
3、运行结果

4、结论
由上图的运行结果,可知方法4的算法效率更高。
优化算法:计算整数二进制表示中1的个数
951





