首先我们要明白原理,怎么在知道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=ⅆ 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位非常好用;
以下是运行截图