题解 | #查找输入整数二进制中1的个数#
查找输入整数二进制中1的个数
https://www.nowcoder.com/practice/1b46eb4cf3fa49b9965ac3c2c1caf5ad
题解:统计二进制中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; } }