华为机试——判断两个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
核心思想:
- 将IP1,IP2,mask分别转换成对应的32位二进制形式的01数组
- 两个IP分别于mask相与,结果仍然是32位的二进制数组,然后逐位进行比较,即可得出是否是同一子网
- 将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);
}
}
}
通过图: