请问已知IP地址和子网掩码,列出所有子网的计算方法,多谢

请教已知IP地址和子网掩码,列出所有子网的计算方法,谢谢!
本帖最后由 Grapevine 于 2014-10-15 09:41:55 编辑
已知IP地址:192.168.1.2,子网掩码为255.255.255.192.
请问如何计算出所有子网:
192.168.1.0
192.168.1.64
192.168.1.128
192.168.1.192

不限于C类地址
谢谢!
------解决思路----------------------
判断0的数量可以用192除以2的N次方,看除到多少不能整除,而不用非转二进制
左移位:x=y<<j 把y左移j位的值给x
又移位:x=y>>j
------解决思路----------------------
引用:
Quote: 引用:

简便方法,256-192=64,那么子网就是
192.168.1.0,
192.168.1.0+64,
192.168.1.0+64*2,
192.168.1.0+64*3

那如果是B类地址呐?
我实在是转不过来这个弯。。。

这个方法很靠谱
B类地址,你直接计算第三段就好了,第四段就是0
就是说,IP地址一共分4段,哪一段不是255或0,才需要计算
------解决思路----------------------

static void Main(string[] args)
{
    foreach (var ip in ListSubnets(IPAddress.Parse("192.168.1.2"), IPAddress.Parse("255.255.255.192")))
    {
        Console.WriteLine(ip);
    }
}
static IEnumerable<IPAddress> ListSubnets(IPAddress ip, IPAddress mask)
{
    Func<IPAddress, uint> ipToUint = x =>
    {
        byte[] bytes = x.GetAddressBytes(); Array.Reverse(bytes);
        return BitConverter.ToUInt32(bytes, 0);
    };

    uint ipValue = ipToUint(ip);
    uint maskValue = ipToUint(mask);
    // 判断是C类,B类,还是A类地址
    uint classValue = ipValue >= 0xC0000000 ? 0xFFFFFF00 : ipValue >= 0x80000000 ? 0xFFFF0000 : 0xFF000000;
    uint subnetId = ipValue & classValue;
            
    uint step = (~maskValue) + 1;
    uint count = (maskValue - classValue) / step + 1;
    for (uint i = 0; i < count; i++)
    {
        yield return new IPAddress(BitConverter.GetBytes(IPAddress.HostToNetworkOrder((int)subnetId)));
        subnetId += step;
    }
}

------解决思路----------------------
引用:
Quote: 引用:

简便方法,256-192=64,那么子网就是
192.168.1.0,
192.168.1.0+64,
192.168.1.0+64*2,
192.168.1.0+64*3

那如果是B类地址呐?
我实在是转不过来这个弯。。。


方法一样的,例如掩码是255.255.192.0,256-192=64,那么子网就是:
x.x.0.0
x.x.(0+64).0
x.x.(0+64*2).0
x.x.(0+64*3).0

你要是想系统学习,请看《CCNA学习指南》第三章