从子网内的广播和地址计算网络掩码和子网地址

时间:2009-09-22 11:51:16

标签: math bit-manipulation

我需要使用来自此子网的广播地址和主机地址来计算网络掩码和子网地址。 我必须只使用按位运算,而不是比较字符串表示,sysadmin工具等。

我有一些计算地址的公式。但我不知道如何将它与我的源数据一起使用。

  • ^ - 是按位xor
  • 〜 - 否定
  • &安培;和|分别是连接和分离
  • 公式:
  • ip | (~m)= b
  • ip& m = n
  • n | (~m)= b
  • n ^ b = ~m

其中n - 是子网地址,b - 广播地址,ip - 来自子网的主机地址,m - 是网络掩码。

(例如,我有192.168.1.160 - 子网地址,192.168.1.191 - 广播,和/ 27网络掩码(255.255.255.224))

2 个答案:

答案 0 :(得分:2)

不可能。假设广播为192.168.1.255且地址为192.168.1.251。它可以是192.168.1.0/24192.168.1.128/25192.168.1.128/26等。

答案 1 :(得分:0)

黑客的答案几乎涵盖了它,除非你有另一个条件,如“最长/最短的网络掩码”。或者,如果事实上问题是要求您显示所有可能的答案。

如果要创建循环解决方案,则指定的操作有点受限。你也想要一些bithift操作。否则,您最多可以运行32个单独的测试,每个测试对应一个可能的网络掩码。假设您要打印所有解决方案,此片段显示了我所得到的内容。

...
m = 255.0.0.0;
if ( ( b & m ) == ( ip & m ) )
{
    n = b & m;
    // Print out b, ip, n and m
}
m = 255.128.0.0;
...

如果要打印出最短/最长的答案,则需要添加变量以存储最佳答案和/或标记,以指示是否找到了答案。

顺便说一句,在黑客的回答中,我认为第三个例子应该是192.168.1.192/26,而不是192.168.1.128/26。因为地址的第四个字节都是1,所以地址的网络部分也必须在第四个字节中都有1个。