子网掩码计算方法
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。
请看以下示例:
运算演示之一:aa
I P 地址 192.168.0.1
子网掩码 255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
运算演示之二:
I P 地址 192.168.0.254
子网掩码 255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
运算演示之三:
I P 地址 192.168.0.4
子网掩码 255.255.255.0
AND运算
转化为二进制进行运算:
I P 地址 11010000.10101000.00000000.00000100
子网掩码 11111111.11111111.11111111.00000000
AND运算
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
通过以上对三组计算机IP地址与子网掩码的AND运算后,我们可以看到它运算结果是一样的。均为192.168.0.0
所以计算机就会把这三台计算机视为是同一子网络。
输入
第一行是本机IP地址
第二行是子网掩码
第三行整数N,表示后面有N个IP地址
第1个IP地址
......
第N个IP地址
输出
计算并输出N个IP地址是否与本机在同一子网内。
对于在同一子网的输出"INNER"
对于在不同子网的输出“OUTER”
--------------------------------------------------------------------------------------------------------------------
#include <cstdio>
#include <cstring>
#include <cstdlib>
#define max 32
//#define _OJ_
int
trans(int n, int *elem, int i1)
//将数字转换为二进制
{
int i2;i2 = (i1 / 8) * 8;
while (n) {
elem[i1--] = n % 2;//逆序赋值
n = n / 2;
}
while (i1 >= i2)
elem[i1--] = 0;
}
void
fun(char *str, int *elem)
{
int i = 0, j = 0, n, l1 = 0, i1 = 0, i0 = 1;
char a[10];
while (str[i] != ‘\0‘) {
for(l1 = 0;l1 < 10; l1++)//注意一定要初始化a[];否则值将不对
a[l1] = 0;
j = 0;
if(‘0‘ <= str[i] && str[i] <= ‘9‘) {
while((str[i] != ‘\0‘) &&‘0‘ <= str[i] && str[i] <= ‘9‘) {
a[j++] = str[i];
i++;
}//收集数据并用atoi转换为整型
n = atoi(a);//printf("n == %d\n", n);
i1 = i0 * 8; trans(n, elem, i1 - 1);
i0++;
continue;
}
else
i++;
}
}
int main(int argc, char const *argv[]) {
#ifndef _OJ_ //ONLINE_JUDGE
freopen("input.txt", "r", stdin);
#endif
int l1, l2, N;
char str[50], str1[50], str2[50];
int elem[50], elem1[50], elem2[50], elem3[50];
gets(str); gets(str1);
fun(str, elem); fun(str1, elem1);//elem1确定子网掩码
for(l1 = 0;l1 < max; l1++) {
if(elem[l1] == 1 && elem1[l1] == 1)
elem2[l1] = 1;
else
elem2[l1] = 0;
}//elem2确定AND的值
scanf("%d", &N);
while(N--) {
scanf("%s", str2);
fun(str2, elem);
for(l1 = 0;l1 < max; l1++) {
if(elem[l1] == 1 && elem1[l1] == 1)
elem3[l1] = 1;
else
elem3[l1] = 0;
}
for(l1 = 0;l1 < max; l1++) {
if(elem3[l1] != elem2[l1]) {
printf("OUTER\n"); break;
}
}//逐个进行比较
if(l1 >= max) printf("INNER\n");
}
return 0;
}