文章目录
- 概述
- 方法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();
}
【运行结果】