c有效网络掩码的代码
我有没有办法检查32位网络掩码有效或不使用按位运算符?
我必须从msb侧检查’1’是否连续流。 例如11111111.0.0.0(255.0.0.0)有效但11111101.0.0.0(253.0.0.0)不有效。
首先要做的是检查网络掩码是否为非零(一个讨厌的边缘情况)。 如果这没关系,你需要采用按位反转。
uint32_t y = ~x;
然后添加一个
uint32_t z = y + 1;
然后,如果x
是一个合适的网络掩码,那么最多只能设置1位。
为了测试它,简单地和z
一起使用z - 1
,恰好是y
。 如果一切正常,结果将为零,否则为非零。
valid = (z & y) == 0;
要检查无效的网络掩码,可以使用以下简单算法:
mask & (~mask >> 1)
对于无效的网络掩码,这将评估为1,对于有效的网络掩码,评估为0。
有效的网络掩码不能为零,右侧有一个。 所有的零必须在其右边有另一个零或者是位0.如果你取一个零的网络掩码的补码(〜)和一个右边的一个,并将它向右移一位位置,您将在网络掩码中将一个与网络掩码的移位的一个补码中的一个对齐。 将这两个值组合在一起将产生一个表示无效网络掩码的值。
在应用此算法(如果它是网络字节顺序)之前,请务必使用ntohl()将网络掩码转换为主机字节顺序。 此外,如果要排除它们,则需要对0xffffffff和0x00000000进行特殊检查。
注意:由于C的运算符的优先级和关联性规则,算法中显示的括号不是必需的,但我已添加它们以使代码更容易理解,以防您不记得优先级和关联性规则。
int is_netmask_valid(uint32_t mask) { if (mask == 0) return 0; if (mask & (~mask >> 1)) { return 0; } else { return 1; } }