题解:统计二进制中1的个数,很容易想到的方法是与1进行&运算并右移,但这种方法遇到有符号数会陷入死循环,因为有符号数右移高位默认是补1的,所以这个数字最终会变成0xFFFFFFFF而陷入死循环。为了避免死循环,可以不右移数字,转为先与1进行&运算,然后将1进行左移,这样进行判断的就是次低位了,反复左移,直到结果为0。第三种解法就比较优秀了,因为一个数减去1后和自己做与运算,得到的结果相当于把该数二进制最右边的1变为0,这样一步步将该数二进制的所有位都变为0,即可统计出1的个数。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
Scanner scanner = new Scanner(br);
int result;
while (scanner.hasNext()){
result = countNumberOf1InBinary3(scanner.nextInt());
System.out.println(result);
}
}
// 解法一:通过与1进行&运算并右移,但遇到有符号数会陷入死循环
private static int countNumberOf1InBinary1(int num) {
int count = 0;
while (num != 0){
if ((num & 1) == 1) count++;
num >>= 1;
}
return count;
}
// 解法二:通过与 1 进行与运算,并将 1 左移,判断每一位是否为1。
private static int countNumberOf1InBinary2(int n) {
int count = 0, flag = 1;
while (flag != 0) {
if ((n & flag) != 0)
count++;
flag = flag << 1;
}
return count;
}
// 解法三: 一个数减去1后与自身进行与运算,得到的结果相当于把该数二进制最右边的1变为0
private static int countNumberOf1InBinary3(int n) {
int count = 0;
while (n != 0) {
n = (n - 1) & n;
count++;
}
return count;
}
}

京公网安备 11010502036488号