子网掩码
子网掩码计算方法
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。
输入格式:
第一行是本机IP地址
第二行是子网掩码
第三行整数N,表示后面有N个IP地址
第1个IP地址
......
第N个IP地址
N<1e5
输出格式:
计算并输出N个IP地址是否与本机在同一子网内。
对于在同一子网的输出"INNER"
对于在不同子网的输出“OUTER”
输入样例:
192.168.0.1
255.255.255.0
3
192.168.0.2
192.168.0.254
192.168.1.2
输出样例:
在这里给出相应的输出。例如:
INNER
INNER
OUTER
代码如下 :
#include<iostream>
#include<string>
using namespace std;
//字符串转int数组
void StringToInt(string s, int r[]) {
int at = 0;
for (int i = 0; i < 4; i++) {
r[i] = 0;
}
for (int i = 0; s[i] != '\0'; i++) {
if (s[i] == '.') {
at++;
continue;
}
else {
int t = s[i] - '0';
if (r[at] == 0) {
r[at] = t;
}
else {
r[at] = r[at] * 10 + t;
}
}
}
}
//与运算
void AndOp(int l[], int v[]) {
for (int i = 0; i < 4; i++) {
l[i] = l[i] & v[i];
}
}
int main() {
int* local = new int[4];
int* subnet = new int[4];
int n;
string ls, ss, result;
int* ns = new int[4];
cin >> ls;
StringToInt(ls, local);
cin >> ss;
StringToInt(ss, subnet);
cin >> n;
string ips;
AndOp(local, subnet);
for (int i = 0; i < n; i++) {
cin >> ips;
StringToInt(ips, ns);
AndOp(ns, subnet);
result = "INNER";
for (int j = 0; j < 4; j++) {
if (ns[j] != local[j]) {
result = "OUTER";
break;
}
}
cout << result;
if (i < n - 1) cout << endl;
}
delete[] local, subnet, ns; //释放空间
return 0;
}