で始まるすべてのサブネットのツリーを想像すると0.0.0.0/32
、サブネットにつながらないすべてのブランチが必要になります。1 ステップ (ビット) 上がり、このビットを null にして、このノードの兄弟 (適切な場所に異なるビットを持つ) をセットに追加します。(Rafał の言うことと同じですが、表現が異なるだけです。) 次のように実行できます (動作する C# コード):
using System;
using System.Text;
namespace so_subnet_complement
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("Enter subnet in the 192.168.0.0/16 format.");
string[] line = Console.ReadLine().Split('/');
string[] segments = line[0].Split('.');
uint ip = 0;
uint multiplier = 1;
for (int i = 3; i >= 0; i--)
{
ip += byte.Parse(segments[i]) * multiplier;
multiplier *= 0x100;
}
int mask = int.Parse(line[1]);
Console.WriteLine("Complement subnets:");
writeComplementSubnets(ip, mask);
}
static void writeComplementSubnets(uint ip, int mask)
{
for (;mask < 32; mask++)
{
uint newIp =(uint)(ip & (0xFFFFFFFF << mask) ^ (1 << mask));
Console.WriteLine("{0}/{1}", ipToString(newIp), mask);
}
}
static string ipToString(uint ip)
{
StringBuilder result = new StringBuilder(15);
uint mask = 0xFF000000;
int shift = 24;
for (int i = 0; i < 4; i++)
{
result.Append((ip & mask) >> shift);
mask >>= 8;
shift -= 8;
if (i < 3)
result.Append('.');
}
return result.ToString();
}
}
}
最も重要なのはwriteComplementSubnets
方法です。192.168.0.0
IPアドレスは(私にとって)自然な表現で表されるため、0xC0A80000
.
編集:ここでは再帰は絶対に不要であることに気付きました。関数型プログラミングは時々間違った考え方を引き起こすようです。