1024 - 子网掩码
子网掩码是用来判断任意两台计算机的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> int main() { int sou[4],netMask[4],subNet[4],n,i; for(i=0;i<4;i++) scanf("%d%*c",&sou[i]); for(i=0;i<4;i++) { scanf("%d%*c",&netMask[i]); sou[i]&=netMask[i]; } scanf("%d",&n); while(n--) { for(i=0;i<4;i++) { scanf("%d%*c",&subNet[i]); subNet[i]&=netMask[i]; } for(i=0;i<4;i++) { if(sou[i]^subNet[i]) break; } if(i<4) puts("OUTER"); else puts("INNER"); } return 0; }
C++解答
#include<stdio.h> int main() { int sou[4],netMask[4],subNet[4],n,i; for(i=0;i<4;i++) scanf("%d%*c",&sou[i]); for(i=0;i<4;i++) { scanf("%d%*c",&netMask[i]); sou[i]&=netMask[i]; } scanf("%d",&n); while(n--) { for(i=0;i<4;i++) { scanf("%d%*c",&subNet[i]); subNet[i]&=netMask[i]; } for(i=0;i<4;i++) { if(sou[i]^subNet[i]) break; } if(i<4) puts("OUTER"); else puts("INNER"); } return 0; }
Java解答
import java.util.Scanner; public class Main { public static int doAnd(int ip, int net){ return ip & net; } public static void main(String[] args) { Scanner in = new Scanner(System.in); String locIp = in.nextLine(); String[] locIptem = locIp.split("\\."); int[] locIps = new int[4]; for(int i=0;i<4;i++)locIps[i] = Integer.parseInt(locIptem[i]); String sub = in.nextLine(); String[] subtem = sub.split("\\."); int[] subs = new int[4]; for(int i=0;i<4;i++)subs[i] = Integer.parseInt(subtem[i]); int[] and = new int[4]; for(int i=0;i<4;i++)and[i] = locIps[i]&subs[i]; int n = Integer.parseInt(in.nextLine()); String[] ss = new String[n]; for(int i=0;i<n;i++){ ss[i] = in.nextLine(); String[] iptem = ss[i].split("\\."); int[] ips = new int[4]; for(int j=0;j<4;j++)ips[j] = Integer.parseInt(iptem[j]); int[] andtem = new int[4]; for(int j=0;j<4;j++)andtem[j] = ips[j]&subs[j]; boolean out = true; for(int j=0;j<4;j++){ if(and[j] != andtem[j]){ out = false; break; } } if(out)System.out.println("INNER"); else System.out.println("OUTER"); } } }
Python解答
import sys dataip,datama = [],[] l = 1 for line in sys.stdin: a = line.split()[0] if l == 1: dataip.append(a) elif l==2: datama.append(a) elif a.find('.')!=-1: dataip.append(a) l += 1 datama=map(lambda x:x.split('.'),datama) dataip=map(lambda x:x.split('.'),dataip) new = [] for i in xrange(len(dataip)): b = [] for j in [0,1,2,3]: a = int(dataip[i][j])&int(datama[0][j]) b.append(a) new.append('.'.join([str(k) for k in b])) for i in xrange(1,len(new)): if new[i]==new[0]: print 'INNER' else: print 'OUTER'