前言:
本篇博客将带大家了解如何求一个整数,在内存当中存储时,二进制1的个数
介绍本题解题思路之前先介绍一个知识点:按位与(&)
&(按位与)---->只要有0就是0
举例:
0000101010100111&0101001010010101---->?
思路一:
看到此题,很自然我们脑海里会思考如何通过代码来实现判断二进制里放的是1还是0,于是乎,按位与(&)便冒出来了。当一个数按位与1时,若该数的二进制形式最右边的数是0,则结果就是0,若是1,则结果就是1。有了可以对二进制表示形式中的最后一位存放的内容的判断方法以后,我们便可以通过循环来实现对每一位的存放内容来进行判断。
代码一:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入待判断的数字:
System.out.println("请输入待判断的数字:");
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
//进行判断
int tmp = n;
int count = 0;//用来计数
while(tmp != 0){
if((tmp&1) == 1){
count ++;
}
tmp >>>=1;
//注意这里一定要是无符号右移,
//如果是有符号右移,n为负数时左边会补1,
//达不到想要的效果
}
System.out.println(n+"的二进制形式中有"+count+"个1");
}
}
结果:
多组输入:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入待判断的数字:
System.out.println("请输入待判断的数字:");
Scanner scanner = new Scanner(System.in);
while(scan.hasNextInt()){
int n = scanner.nextInt();
//进行判断
int tmp = n;
int count = 0;//用来计数
while(tmp != 0){
if((tmp&1) == 1){
count ++;
}
tmp >>>=1;
}
System.out.println(n+"的二进制形式中有"+count+"个1");
}
}
}
代码二:
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数字:
Scanner scan = new Scanner(System.in);
while(scan.hasNextInt()){
int n = scan.nextInt();
//计算其二进制中1的个数:
int count = 0;
for (int i = 0; i < 31; i++) {//i < 31确保了不会把符号位计算在内
if(((n >>> i) & 1)!=0){
count ++;
}
}
System.out.println("该整数的二进制形式中有"+count+"个1");
}
}
结果:
思路二:
一个数按位与比它小一的数,一直到结果是0,按位与的次数就是该数二进制形式中1的个数
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
//输入数字:
Scanner scan = new Scanner(System.in);
while(scan.hasNextInt()){
int n = scan.nextInt();
//计算其二进制中1的个数:
int count = 0;
while(n != 0){
n = n & (n-1);
count ++;
}
System.out.println("该整数的二进制形式中有"+count+"个1");
}
}
}
结果: