JavaSE习题 用Java实现二进制中1的个数与输出二进制奇偶序列
目录
1. 二进制中1的个数
题目一:求一个整数,在内存当中存储时,二进制1的个数。
问题分析:a.如何将输入的十进制转变为二进制?
答:使用按位与&操作时将会将十进制自动转换为二进制。
b. 如何统计1的个数?
答:将数字与1相与, 如果相与结果为1,表示该整数的最后一位为1。
逐次右移>>1位,每次向右移1位可将该整数最后一位去除,从而判断有几个1。
所以我们可以得到如下代码:
import java.util.Scanner;
public class TestDome {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
int num =0;
while(a!=0) {
if ((a &1) == 1){
num++;
}
a = a >>1;
}
System.out.println("二进制中1的个数为" +num);
}
}
运行结果如下:
2. 输出二进制序列
题目二:获取一个数二进制序列中所有的偶数位和奇数位,分别输出二进制序列。
问题分析:a.如何输出二进制序列?
答:使用按位与&操作时将会将十进制自动转换为二进制。
b.此题与题目一的区别是什么?
答:此题要想得到的是奇数位序列和偶数列序列,并非正常的二进制序列。
所以,每次循环时变量应一次性改变为2。
c.如何有序提取各位上的1或0?
答:将数字与1相与, 如果相与结果为1,表示该整数的最后一位为1。反之则为0。
逐次右移>>2位,每次向右移2位可将该整数最后一位取出,从而有序提取出各位上的1或0。
注意事项:
a.因为二进制序列输出需要有序输出,即高位先输出,不能颠倒顺序,所以变量循环时必须从相应的最高位开始,每次减2。
b.因为需要奇数位序列与偶数列序列,所以我们应该分成两种情况:
One:奇数位序列——因为二进制序列的最后一位就属于奇数位,所以不用进行右移 ,直接与1相与便可得到结果(也就意思相当于右移了0位), 所以在设置循环变量的时候最大值(最高位)为31, 最小值(最低位)为0。
Two: 偶数位序列——因为奇数位在设置循环变量的时候最大值(最高位)为31, 最小值(最低位)为0。所以,偶数位最大值应为32,最小值为1。
所以我们可以得到如下代码:
import java.util.Scanner;
public class TestDome {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
System.out.print("偶数位序列:" );
for(int i = 31;i >=1 ;i -= 2){
System.out.print( a>>i & 1);
}
System.out.println(" ");
System.out.print("奇数位序列:");
for(int i = 30;i >=0;i -= 2){
System.out.print( a>>i & 1);
}
scanner.close();
}
}
运行结果如下: