子网掩码校验方法

识别有效的IP地址和掩码并进行分类统计

http://www.nowcoder.com/questionTerminal/de538edd6f7e4bc3a5689723a7435682

子网掩码转换为二进制后,前面x位都为1,后面x为都为0。通常的子网掩码校验方法基本都是循环校验,实现比较复杂。今天向大家介绍一个简单的校验子网掩码的方法。
假设子网掩码其中一段为mask=11110000
1.对子网掩码取反(或者与0xFFFFFFFF异或),取反后子网掩码为00001111
2.取反后的子网掩码+1,得到m=00010000
3.将子网掩码与上一步的结果按位或,mask|m=11110000
4.我们发现按位或时,m的值不会导致子网掩码变化。

当子网掩码出错时,假设mask=11010000
m=00101111+1=00110000
此时将m与mask按位与时,我们发现m的第三位将会改变mask的值

此外我们不能忽略00000000与11111111的情况,这两种情况比较特殊,可以直接用if判断过滤掉

根据以上分析,我们可以写出判断子网掩码的方法

if(mask<=0 || mask>=0xFFFFFFFFL || (((mask ^ 0xFFFFFFFFL) + 1) | mask) != mask) {
    // 子网掩码错误处理代码
}
全部评论
子网掩码出错时,假设mask=11010000 m=00101111+1=00110000 此时将m与mask按位与时,我们发现m的第三位将会改变mask的值
1 回复 分享
发布于 2021-07-07 08:36
不对吧
点赞 回复 分享
发布于 2021-07-07 08:36
按位与?
点赞 回复 分享
发布于 2021-07-07 08:37
试试
点赞 回复 分享
发布于 2022-08-28 09:21 山东
不对
点赞 回复 分享
发布于 2022-08-28 13:15 山东
没有问题,不过如果用java实现的话,因为java没有无符号数,所以要不然mask定义为long,要不然判断就要改成if(mask==0 || mask==0xFFFFFFFFL || (((mask ^ 0xFFFFFFFFL) + 1) | mask) != mask)
点赞 回复 分享
发布于 2023-04-11 19:54 湖南

相关推荐

无情咸鱼王的秋招日记之薛定谔的Offer:好拒信,偷了,希望有机会用到
点赞 评论 收藏
分享
11-18 15:57
门头沟学院 Java
最终归宿是测开:这个重邮的大佬在重邮很有名的,他就喜欢打92的脸,越有人质疑他,他越觉得爽😂
点赞 评论 收藏
分享
30 1 评论
分享
牛客网
牛客企业服务