100分~求一ip掩码的算法 如ip段:2.2.2.2-2.2.2.8可以拆分成2.2.2.2/31 2.2.2.4/30 2.2.2.8/32三个掩码格式,现求任意ip段拆分成如上掩码格式的算法~谢谢 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 是否表述不够清楚,ip掩码可以表示可以用/24等形式,如2.2.2.0-2.2.2.255,可以表示为2.2.2.0/24,代表包含所有2.2.2.x网段的ip,但如上边的2.2.2.2-2.2.2.8这个ip段,无法只用一个/24之类的掩码精确表示,须划分为多个掩码: 2.2.2.2/31包含2.2.2.2和2.2.2.3两个ip, 2.2.2.4/30包含2.2.2.4-2.2.2.7四个ip, 2.2.2.8/32代表2.2.2.8本身我想要的是求任意一个ip段如何划分掩码的算法~希望各位大虾帮忙~~~ 现写了一段,计算32位数掩码,IP转换成unsigned int即可 unsigned int n1 = 2; unsigned int n2 = 8; for (int i = n1; i <= n2; ) { unsigned int nShift, nMask, nDelta; for (unsigned int k = 0; k < 32; k++) { unsigned int ns = k; unsigned int nm = i & (0xffffffff << ns); unsigned int nd = 1 << ns; if (i != nm || i + nd - 1 > n2) break; nShift = ns; nMask = nm; nDelta = nd; } cout << nMask << "/" << 32 - nShift << endl; i = i + nDelta; } 不好意思,可能我还没说清楚,我要的是精确的ip段的掩码,2.2.2.2的8位二进制最后一个2表示为0000 0010, 如果掩码为/28(最后8位11110000),则表示的ip段是2.2.2.0-2.2.2.15,超出了所要求的2.2.2.2-2.2.2.8范围 如果掩码为/29(最后8位11111000),则表示的ip段是2.2.2.0-2.2.2.7,也不在范围内 掩码/30(最后8位11111100),则是2.2.2.0-2.2.2.3也是不对的所以只能分成多个掩码表示,就像上边说的 2.2.2.2/31(11111110)包含2.2.2.2和2.2.2.3两个ip, 2.2.2.4/30(11111100)包含2.2.2.4-2.2.2.7四个ip, 2.2.2.8/32(11111111)代表2.2.2.8本身 程序没错,你试就知道了(第3行是unsigned int i)使用的时候要把IP转成int,如ip2.2.2.2转成0x02020202,ip2.2.2.8转成0x02020208计算后再把int转换成IP格式, 关于文字处理中字符串的问题 执行这些代码为什么报错 在控件中绘图怎么不显示 用扫描仪采集图像到数据库,并可以实现从数据库读出图像,帮忙如何实现?谢谢! access数据库和程序不在同一个文件夹下,连接数据库错误如何解决 Static 控件透明问题 请问如何改变客户区的color? 怎么样使CPropertySheet显示时没有标题栏? 新开线程问题 MFC m_pRecordset得到的查询数据库的结果怎么得到第一条记录的第一列值? 关于画图的一段代码,请大家请来看看!!
2.2.2.2/31包含2.2.2.2和2.2.2.3两个ip,
2.2.2.4/30包含2.2.2.4-2.2.2.7四个ip,
2.2.2.8/32代表2.2.2.8本身
我想要的是求任意一个ip段如何划分掩码的算法~希望各位大虾帮忙~~~
unsigned int n1 = 2;
unsigned int n2 = 8;
for (int i = n1; i <= n2; ) {
unsigned int nShift, nMask, nDelta;
for (unsigned int k = 0; k < 32; k++) {
unsigned int ns = k;
unsigned int nm = i & (0xffffffff << ns);
unsigned int nd = 1 << ns;
if (i != nm || i + nd - 1 > n2) break;
nShift = ns;
nMask = nm;
nDelta = nd;
}
cout << nMask << "/" << 32 - nShift << endl;
i = i + nDelta;
}
如果掩码为/28(最后8位11110000),则表示的ip段是2.2.2.0-2.2.2.15,超出了所要求的2.2.2.2-2.2.2.8范围
如果掩码为/29(最后8位11111000),则表示的ip段是2.2.2.0-2.2.2.7,也不在范围内
掩码/30(最后8位11111100),则是2.2.2.0-2.2.2.3也是不对的
所以只能分成多个掩码表示,就像上边说的
2.2.2.2/31(11111110)包含2.2.2.2和2.2.2.3两个ip,
2.2.2.4/30(11111100)包含2.2.2.4-2.2.2.7四个ip,
2.2.2.8/32(11111111)代表2.2.2.8本身
使用的时候要把IP转成int,如ip2.2.2.2转成0x02020202,ip2.2.2.8转成0x02020208
计算后再把int转换成IP格式,