JavaSE习题 用Java实现二进制中1的个数与输出二进制奇偶序列

JavaSE习题 用Java实现二进制中1的个数与输出二进制奇偶序列

目录

1. 二进制中1的个数

2 .输出二进制序列


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();
    }

    }

运行结果如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值