我们知道, 对于一个不为0的数字a, 如果 a & (a-1) 为0的话, 则a是2的n次幂. 完整的c语言表达式如下.
if (a && (a & (a-1)) == 0)
//a是2的n次幂
对于32位的子网掩码x, 我们知道规则: 前n个bit为1, 后m个bit为0. 我们进行2进制取反的话, ~x就是: 前n个bit为0, 后m个bit为1. 再加上1(~x + 1), 则是, 前n-1个bit为0, 中间一个1, 最后m个bit为0, 刚好是2的n次幂. 所以有了下面的表达式:
if ( ((~x + 1) & (~x)) == 0)
//x是合法的子网掩码
也可以用或运算:
if (((x-1) | x) == 0xffffffff)
//x是合法的子网掩码
使用位运算的好处是性能更高.