码迷,mamicode.com
首页 > 其他好文 > 详细

子网掩码

时间:2015-11-27 21:58:12      阅读:215      评论:0      收藏:0      [点我收藏+]

标签:

子网掩码计算方法
  子网掩码是用来判断任意两台计算机的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;
}

子网掩码

标签:

原文地址:http://www.cnblogs.com/airfand/p/5001714.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!