计算机网络计算网络号,子网号,主机号的小程序

该博客详细介绍了如何根据IP地址和子网掩码计算网络号、子网号和主机号。通过示例程序展示了A、B、C类IP地址的分类方式,并使用C++的bitset库进行二进制操作。程序接收用户输入的IP地址和子网掩码,然后输出网络号、子网号和主机号的十进制表示。
摘要由CSDN通过智能技术生成

首先我们要明白原理,怎么在知道IP地址的前提下,通过计算得到网络号,子网号,主机号?
在这里插入图片描述需要注意的就是A类第一个八位是网络号,B类前两个八位是网络号,C类就是前三个八位是网络号。
那么怎么给IP地址分类是怎么样进行的?
有如下的图在这里插入图片描述
由此可以明白网络号,子网号和主机号是如何运算的。
可以写一个简单的小程序

#include <bits/stdc++.h>
using namespace std;
int main()
{
    while(1)
    {
        cout<<'\n'<<'\n';
         int x[5],ym=0,pd=0;
    for(int j=0; j<4; j++)
    {
        cin>>x[j];
    }
    bitset<8> a(x[0]),b(x[1]),c(x[2]),d(x[3]),*p,*pp,*result;
    cin>>ym;
    bitset<8> aa,bb,cc,dd,n1,n2,n3,n4,zw1,zw2,zw3,zw4,wl1,wl2,wl3,wl4,zj1,zj2,zj3,zj4;
    int j=0,zwym=ym;
    while(ym)
    {
            switch(j)
        {
        case 0:     p=&aa;       break;
        case 1:     p=&bb;       break;
        case 2:     p=&cc;       break;
        case 3:     p=&dd;       break;
        }
        if(ym>=8)
            (*p).set();
        else
        {
            int js=7;
            while(ym)
            {
                (*p).set(js);
                ym--;
                js--;
            }
            break;
        }
        j++;
        ym-=8;
    }
    for(int j=0; j<4; j++)
    {
        bitset<8> *rezj;
        switch(j)
        {
        case 0:     p=&a,pp=&aa,result=&n1,rezj=&zj1;     break;
        case 1:     p=&b,pp=&bb,result=&n2,rezj=&zj2;     break;
        case 2:     p=&c,pp=&cc,result=&n3,rezj=&zj3;     break;
        case 3:     p=&d,pp=&dd,result=&n4,rezj=&zj4;     break;
        }
        *result=(*p)&(*pp);
        *rezj=(*p)^(*result);
    }
    unsigned long k=a.to_ulong();
    if(k>=0&&k<=127)        pd=8;
    else if(k>=128&&k<=191)     pd=16;
    else if(k>=192&&k<=223)     pd=24;
    int l=0;
    while(zwym>0)
    {
            switch(l)
        {
        case 0:     p=&wl1,pp=&zw1,result=&n1;                                 break;
        case 1:     p=&wl2,pp=&zw2,result=&n2;                                 break;
        case 2:     p=&wl3,pp=&zw3,result=&n3;                                 break;
        case 3:     p=&wl4,pp=&zw4,result=&n4;                                 break;
        }
        if(zwym)
        {
            if(pd>0)
                *p=*result;
            else
                *pp=*result;

        }
        pd-=8;
        zwym-=8;
        l++;
    }
        cout<<"网络号:";
           for(int js=0; js<4; js++)
    {
        switch(js)
        {
        case 0:     p=&wl1;       break;
        case 1:     p=&wl2;       break;
        case 2:     p=&wl3;       break;
        case 3:     p=&wl4;       break;

        }
        printf("%d",*p);
    cout<<'.';
    }cout<<"\n";
        cout<<"子网号:";
           for(int js=0; js<4; js++)
    {
        switch(js)
        {
        case 0:     p=&zw1;       break;
        case 1:     p=&zw2;       break;
        case 2:     p=&zw3;       break;
        case 3:     p=&zw4;       break;

        }
        printf("%d",*p);
    cout<<'.';
    }cout<<'\n';
    cout<<"主机号:";
           for(int js=0; js<4; js++)
    {
        switch(js)
        {
        case 0:     p=&zj1;       break;
        case 1:     p=&zj2;       break;
        case 2:     p=&zj3;       break;
        case 3:     p=&zj4;       break;

        }
        printf("%d",*p);
    cout<<'.';
    }
    }



    /*
    for(int js=0; js<4; js++)
    {
        switch(js)
        {
        case 0:     p=&a;       break;
        case 1:     p=&b;       break;
        case 2:     p=&c;       break;
        case 3:     p=&d;       break;

        }
        cout<<*p;
    cout<<'.';
    }  */

}

写的不够简洁,但是容易理解,a,b,c,d是IP的四个八位,aa,bb,cc,dd是子网掩码的四个八位,n1,n2,n3,n4是IP和子网掩码与运算之后的结果。

用了一个bitset容器,存放二进制,8位非常好用;
以下是运行截图
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值