public class NumberOf1 {
/**
* 算法思路:
* 进行无符号右移, 无符号右移时, 会在前面补0
* 这种算法的弊端在于,要循环32次
* @param n
* @return
*/
public static int count1(int n) {
int result = 0;
while(n != 0){
result += n&1;
n >>>= 1; // 无符号右移,在前面补0
}
return result;
}
/**
* 解决思路:有几个1循环几次
* 每次去掉最右侧的1
* @param n
* @return
*/
public static int count2(int n) {
int result = 0;
while(n != 0){
n= n & (n-1);
result++;
}
return result;
}
/**
* 解决思路:有几个1循环几次
* 每次去掉最右侧的1
* @param n
* @return
*/
public static int count3(int n) {
int result = 0;
while(n != 0){
n -= n&(~n+1);
result++;
}
return result;
}
public static void printNumBit(int n) {
for (int i = 31; i != -1; i--) {
if ((n & (1 << i)) != 0) {
System.out.print(1);
} else {
System.out.print(0);
}
}
System.out.println();
}
public static void main(String[] args) {
int num = 5;
System.out.println(count1(num));
System.out.println(count2(num));
System.out.println(count3(num));
printNumBit(num);
}
}
整数的二进制表示中有多少个1
最新推荐文章于 2019-04-10 21:14:51 发布