Math 根据广播和子网内地址计算网络掩码和子网地址

Math 根据广播和子网内地址计算网络掩码和子网地址,math,bit-manipulation,Math,Bit Manipulation,我需要使用此子网的广播地址和主机地址计算网络掩码和子网地址。 我必须只使用按位操作,而不是比较字符串表示、系统管理工具等 我有一些计算地址的公式。但我不知道如何将它用于我的源数据 ^--按位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网络掩

我需要使用此子网的广播地址和主机地址计算网络掩码和子网地址。 我必须只使用按位操作,而不是比较字符串表示、系统管理工具等

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

  • ^--按位
    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))

不可能。假设广播是
192.168.1.255
,地址是
192.168.1.251
。它可以是
192.168.1.0/24
192.168.1.128/25
192.168.1.128/26
,等等。

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

如果要创建循环解决方案,则指定的操作有点有限。您还需要一些位移位操作。否则,最多可以运行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;
...
如果要打印最短/最长答案,则需要添加变量以存储最佳答案和/或标记,以指示是否已找到答案


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

是我。如果有人对它感兴趣:)我很怀疑它可能是家庭作业。家庭作业问题通常都有解决办法。首先,我想得到二进制表示ip地址和广播的相等部分。例如:11000000010101000110111111(广播)11000000010101000110101100(ip)具有相等的部分
110000000101010001101
。尾随零表示子网地址。此外,我可以通过反转(ip xor广播)的结果来计算网络掩码的第一位,但最后一位包含垃圾值。如我在示例中所示,广播和实际ip地址的重叠部分不一定是网络,因为ip地址主机部分的最重要位可能是1s。