文章目录
- 概述
- 方法1
- 方法2
- 方法3
概述
返回参数中二进制中1的个数。 如: 15(十进制) —— 0000 1111(二进制) —— 4个1
①我们把二进制的数字的每一位都&1,其中:1&1=1 、0&1=0
②用无符号右移(>>>)来让每一位都与1相比较。
方法1
【概述】
用 for 循环,参数是32位的,所以我们循环32次。
【代码】
import java.util.Scanner;public static void fac1(){Scanner sc = new Scanner(System.in);int n = sc.nextInt();int count = 0;for (int i = 0; i < 32; i++) { //有32位,移32次if (((n >>> i) & 1)== 1) {count++;}}System.out.println(count);}public static void main(String[] args) {fac1();}
【运行结果】
方法2
【概述】
用while循环来做,直接比较n是否为0,这样就不用管循环了多少次。
【代码】
public static void fac2() {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int count = 0;while (n != 0) {if ((n & 1) == 1) {count++;}n = n >>> 1;}System.out.println(count);}
public static void main(String[] args) {fac2();}
【运行结果】
方法3
【概述】
用参数n & (n-1),每&一次都会少一个1,直到结果为0的时候结束。
如:7
【代码】
public static void fac3() {Scanner sc = new Scanner(System.in);int n = sc.nextInt();int count = 0;while (n != 0) {n = n & (n-1);count++;}System.out.println(count);}public static void main(String[] args) {fac3();}
【运行结果】