欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

华为机试——判断两个IP时候属于同一个子网

程序员文章站 2022-05-19 14:47:37
...

题目:

子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。 最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。

给定两个IP和一个子网掩码,判断两个IP是否属于同一子网。输出0代表不是同一子网,输出1代表是同一子网。同时输出第一个IP与子网掩码相与的结果。

相与过程示范:

IP地址:192.168.0.1 子网掩码:255.255.255.0 AND运算 转化为二进制进行运算:

IP地址:11010000.10101000.00000000.00000001

子网掩码:11111111.11111111.11111111.00000000

AND运算:11010000.10101000.00000000.00000000 转化为十进制后为: 192.168.0.0

输入:

输入一行字符 代表两个ip和一个子网掩码,中间实用空格隔开

eg1: 192.168.1.1 192.168.1.2 255.255.255.0

eg2: 182.168.1.1 192.168.2.1 255.255.255.0

输出:

如果两个ip是同一子网输出0,否则输出1。同时输出第一个ip与子网掩码相与的结果(10进制)

与输入相对应输出:

eg1: 1 192.168.1.0

eg2: 0 192.168.1.0

核心思想:

  1. 将IP1,IP2,mask分别转换成对应的32位二进制形式的01数组
  2. 两个IP分别于mask相与,结果仍然是32位的二进制数组,然后逐位进行比较,即可得出是否是同一子网
  3. 将IP1与mask相与后的二进制数组再转换为对应的十进制形式的IP输出即可

代码:

#include<stdio.h>
#include<string.h>
#include<vector>
#include<math.h>
using namespace std;
vector<int> transToArray(char str[]); //将一个ip字符串转换为各个部分对应的整数,进一步转换为二进制返回
vector<int> trans_to_b2(int num); //将一个十进制的数转换为它的二进制逆序 eg:2 -->01
void isRight(vector<int> ip1, vector<int> ip2, vector<int> mask);//判断两个ip是否在同一子网下,并打印ip1与mask的与值
int trans_to_num(vector<int> ip);//将二进制的ip再转换为十进制
int main()
{
    char ip1[50];
    char ip2[50];
    char mask[50];
    scanf("%s %s %s",ip1,ip2,mask);
    
    vector<int> ip1_trans = transToArray(ip1);
    vector<int> ip2_trans = transToArray(ip2);
    vector<int> mask_trans = transToArray(mask);
    
    isRight(ip1_trans, ip2_trans, mask_trans);
    
}
void isRight(vector<int> ip1, vector<int> ip2, vector<int> mask)
{
	int k = 1;
	for(int i=0; i<32; i++){
		if( ip1[i]==1 && mask[i]==1 ){
			ip1[i] = 1;
		}else{
			ip1[i] = 0;
		}
	}
	for(int i=0; i<32; i++){
		if( ip2[i]==1 && mask[i]==1 ){
			ip2[i] = 1;
		}else{
			ip2[i] = 0;
		}
	}
	for(int i=0; i<32; i++){
		if( ip1[i]!=ip2[i] ){
			k = 0;
		}
	}
	printf("%d ",k);
	trans_to_num(ip1);
}
vector<int> transToArray(char str[])//把字符串转换为二进制存储
{
	vector<int> b2(32);
	b2.clear();
    int len = strlen(str);
    str[len]='.';
    len++;
    int i=0; int j=0;
    for(j=0; j<len; j++){
        if(str[j]=='.'){
            int num = 0;
            for(int k=j-1,t=0; k>=i; t++,k--){
                num += (str[k]-48)*(int)pow(10,t);
            }
            vector<int> t = trans_to_b2(num);
			if( t.size()<8 ){
				for(int k=0; k<8-t.size(); k++)
					b2.push_back(0);
			}
			for(int k=t.size()-1; k>=0; k--){
				b2.push_back(t[k]);
			}
            i = j+1;
        }
    }
    return b2;
}
vector<int> trans_to_b2(int num)
{
	vector<int> tra(8);
	tra.clear();
	while(num!=0){
		tra.push_back(num%2);
		num = num/2;
	}
	return tra;
}
int trans_to_num(vector<int> ip)
{
	int j=7;
	for(int k=0; k<4; k++){
		int num=0;
		for(int i=j,t=0;i>=j-7;i--,t++){
			num+=ip[i]*(int)pow(2,t);
		}
		j+=8;
		if(k<3){
			printf("%d.",num);
		}else{
			printf("%d\n",num);
		}
	}
}

通过图:

华为机试——判断两个IP时候属于同一个子网

 

 

相关标签: 编程题