2020年3月25日华为春招真题第1题详解+Java代码实现——2进制与10进制的相互转换(校招,代码,原理解释)

一、问题背景

博主最近在准备2020年的软件工程编程领域的春招,其中华为提供了博主上机考试的机会,因此博主参加了2020年3月25日的华为校园春招。其中博主李同学做出了2020年3月25日华为校园春招真题的第1题和第2题,第1题的题目描述和Java代码实现如下文所示,但第2题的题目描述和Java代码实现请见博主的此篇文章2020年3月25日华为春招真题第2题详解+Java代码实现——最大正方形子矩阵

二、2020年3月25日华为校园春招真题的第1题(2进制与10进制的相互转换)

1.题目描述

题目描述:根据给定的两个IP地址和一个子网掩码,计算这两个IP地址的网关。若这两个IP地址的网关相同,则输出1和第一个IP地址的网关;若这两个IP地址的网关不相同,则输出0和第一个IP地址的网关。


若输入以下两个IP地址和一个子网掩码:

192.168.1.1 192.168.1.2 255.255.255.0

上述输入对应的输出为:

1 192.168.1.0

若输入以下两IP地址和一个子网掩码,例如:

192.168.1.1 192.168.2.1 255.255.255.0

上述输入对应的输出为:

0 192.168.1.0

2.Java代码实现

import java.util.Scanner;

public class Problem1ofHuawei {
    public static void main(String[] args) {
        //分别用3个String数组存储 2个ip地址和子网掩码的各个10进制的数
        Scanner scanner=new Scanner(System.in);
        //每个字符串数组有4个字符串类型的数,对应10进制的ip地址和子网掩码(如192、168、1、1)
        String[] ip1=scanner.next().split("\\.");
        String[] ip2=scanner.next().split("\\.");
        String[] subnetMask=scanner.next().split("\\.");

        //用3个二维数组分别存储2进制的ip地址和子网掩码
        int[][] ip1Binary=new int[4][8];
        int[][] ip2Binary=new int[4][8];
        int[][] subnetMaskBinary=new int[4][8];

        //二进制转化为十进制
        for (int i = 0; i < ip1Binary.length; i++) {
            ip1Binary[i]=tenToBinary(Integer.parseInt(ip1[i]));
            ip2Binary[i]=tenToBinary(Integer.parseInt(ip2[i]));
            subnetMaskBinary[i]=tenToBinary(Integer.parseInt(subnetMask[i]));
        }

        //ip1的网关
        int[] ip1Gateway=ipGateway(ip1Binary,subnetMaskBinary);
        //ip2的网关
        int[] ip2Gateway=ipGateway(ip2Binary,subnetMaskBinary);

        //判定ip1与ip2网关是否相等,相等返回1,否则返回0
        if (ip1Gateway[0]==ip2Gateway[0] && ip1Gateway[1]==ip2Gateway[1] && ip1Gateway[2]==ip2Gateway[2] && ip1Gateway[3]==ip2Gateway[3]){
            System.out.print("1 ");
        }else {
            System.out.print("0 ");
        }

        //根据题意再输出ip1的网关
        for (int i = 0; i < ip1Gateway.length; i++) {
            System.out.print(ip1Gateway[i]);
            //输出 在两个数值之间的英文句号.
            if (i!=ip1Gateway.length-1){
                System.out.print(".");
            }
        }
        
    }

    //将ip地址和子网掩码的每个10进制数转化为2进制的int类型数组,0~255用8位即可表达
    public static int[] tenToBinary(int number10){
        //长度为8的int数组存储number10的二进制表示
        int[] numberArray2=new int[8];
        for (int i = 0; i < 8; i++) {
            //255是否大于128,是的话 数组第0位置为1,再将255-128=127
            if (number10>=Math.pow(2,7-i)){
                numberArray2[i]=1;
                number10-=Math.pow(2,7-i);
            }else{
                numberArray2[i]=0;
            }
        }
        return numberArray2;
    }

    //通过形式参数中的IP地址和子网掩码,来计算出IP地址的网关
    public static int[] ipGateway(int[][] ip,int[][] subnetMask){
        //二维数组的长度是[4][8]
        int[][] gateway=new int[4][8];
        for (int i = 0; i < ip.length; i++) {
            for (int j = 0; j < ip[0].length; j++) {
                if (ip[i][j]==1 && subnetMask[i][j]==1){
                    gateway[i][j]=1;
                }else {
                    gateway[i][j]=0;
                }
            }
        }

        //经过上面的计算,gateway是一个2进制的ip网关,还需要转换为10进制
        int[] gateway10=new int[4];
        for (int i = 0; i < gateway10.length; i++) {
            gateway10[i]=binaryToTen(gateway[i]);
        }
        return gateway10;
    }

    //将2进制的int型数组转换为一个10进制的int型整数
    public static int binaryToTen(int[] binaryNumber){
        int number10=0;
        for (int i = 0; i < 8; i++) {
            if (binaryNumber[i]==1){
                number10+=Math.pow(2,7-i);
            }
        }
        return number10;
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐李同学(李俊德-大连理工大学)

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值