2875 - 【设计型】第11章:指针和数组 子网掩码
子网掩码是用来判断任意两台计算机的IP地址是否属于同一子网络的根据。
最为简单的理解就是两台计算机各自的IP地址与子网掩码进行AND运算后,如果得出的结果是相同的,则说明这两台计算机是处于同一个子网络上的,可以进行直接的通讯。就这么简单。
请看以下示例:
运算演示之一:
IP地址 192.168.0.1
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.00000001
子网掩码 11111111.11111111.11111111.00000000
AND运算:
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
运算演示之二:
IP地址 192.168.0.254
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 11010000.10101000.00000000.11111110
子网掩码 11111111.11111111.11111111.00000000
AND运算:
11010000.10101000.00000000.00000000
转化为十进制后为:
192.168.0.0
运算演示之三:
IP地址 192.168.0.4
子网掩码 255.255.255.0
转化为二进制进行运算:
IP地址 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地址;
接下来N行:
第1个IP地址
...
...
第N个IP地址
题目输出
计算并输出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
C语言解答
#include<stdio.h> #include<math.h> #include<stdlib.h> int main() { int a[4] = {0}; int e[4] = {0}; int r_a[4] = {0}; int i, j, k; int temp_1; int temp_2; int temp_3; int temp_4; int temp_5; int temp_6; int temp_7; char a_B[4][8]; char e_B[4][8]; char r_B[4][8]; scanf("%d.%d.%d.%d", &a[0], &a[1], &a[2], &a[3]); scanf("%d.%d.%d.%d", &e[0], &e[1], &e[2], &e[3]); for(i = 0; i < 8; i++) { a_B[0][i] = '0'; a_B[1][i] = '0'; a_B[2][i] = '0'; a_B[3][i] = '0'; e_B[0][i] = '0'; e_B[1][i] = '0'; e_B[2][i] = '0'; e_B[3][i] = '0'; r_B[0][i] = '0'; r_B[1][i] = '0'; r_B[2][i] = '0'; r_B[3][i] = '0'; } for(i = 0; i < 4; i++) { temp_1 = 0; temp_4 = a[i]; temp_5 = e[i]; while(a[i]) { temp_2 = a[i] % 2; a_B[i][temp_1] = '0' + temp_2; a[i] /= 2; temp_1++; } a[i] = temp_4; temp_1 = 0; while(e[i]) { temp_2 = e[i] % 2; e_B[i][temp_1] = '0' + temp_2; e[i] /= 2; temp_1++; } e[i] = temp_5; for(j = 0; j < 8; j++) { if(a_B[i][j] == '1' && e_B[i][j] == '1') { r_B[i][j] = '1'; } else { r_B[i][j] = '0'; } temp_6 = r_B[i][j] - '0'; temp_7 = pow(2, j); r_a[i] += temp_6 * temp_7; } } int n_i; int n; scanf("%d", &n); int *nResult = (int *)malloc(n*sizeof(int)); char n_a_B[4][8]; char n_r_B[4][8]; int n_a[4] = {0}; int n_r_a[4] = {0}; for(n_i = 0; n_i < n; n_i++) { nResult[n_i] = 1; scanf("%d.%d.%d.%d", &n_a[0], &n_a[1], &n_a[2], &n_a[3]); for(i = 0; i < 8; i++) { n_a_B[0][i] = '0'; n_a_B[1][i] = '0'; n_a_B[2][i] = '0'; n_a_B[3][i] = '0'; n_r_B[0][i] = '0'; n_r_B[1][i] = '0'; n_r_B[2][i] = '0'; n_r_B[3][i] = '0'; } for(i = 0; i < 4; i++) { n_r_a[i] = 0; } for(i = 0; i < 4; i++) { temp_1 = 0; temp_4 = n_a[i]; while(n_a[i]) { temp_2 = n_a[i] % 2; n_a_B[i][temp_1] = '0' + temp_2; n_a[i] /= 2; temp_1++; } n_a[i] = temp_4; for(j = 0; j < 8; j++) { if(n_a_B[i][j] == '1' && e_B[i][j] == '1') { n_r_B[i][j] = '1'; } else { n_r_B[i][j] = '0'; } temp_6 = n_r_B[i][j] - '0'; temp_7 = pow(2, j); n_r_a[i] += temp_6 * temp_7; } } for(i = 0; i < 4; i++) { if(n_r_a[i] != r_a[i]) { nResult[n_i] = 0; break; } } } for(i = 0; i < n; i++) { if(nResult[i]) { printf("INNER\n"); } else { printf("OUTER\n"); } } return 0; }