ipv4的地址用32位二进制数表示,为了显示方便,一般是按4段十进制数表示,每段取值范围是0-255,对应二进制数00000000-11111111
有些场合,掩码是用4段十进制数表示,跟ip地址一样,另外一些场合是用0-32之间是数字表示掩码长度。
掩码的IP地址用二进制表示的话,看起来很直观,掩码就是一个32位的二进制数,掩码长度就是它从左到右的连续的1的个数。
那么换算方法也很简单
...var regmasklen=/^([0-9]|[1-2][0-9]|[3][0-2])$/;...if (regmasklen.test(value)==false) alert("掩码长度范围:0-32") //对掩码长度的输入进行合法性校验else {let masklen=Number(value);let maskvalue=(2**32)-(2**(32-masklen));let ips1=maskvalue>>>24;let ips2=(maskvalue>>16)&255;let ips3=(maskvalue>>8)&255;let ips4=maskvalue&255);$("#mask").val(ips1+"."+ips2+"."+ips3+"."+ips4)}
聪明的你可能一眼看出来不和谐的地方了,为什么代码里那句计算掩码值用幂运算,而不用位左移,位移操作不是更快么?啊,这个是JavaScript语言的锅,在JavaScript里位操作是按32位二进制操作的,1左移32位的话,还会变成1,而不是期待的2**32,虽然用比较判断,添加些逻辑也可以用位操作搞,不过代码就更复杂了,也不清晰明了,感觉纯属添乱了。
let maskvalue=(!masklen) ? 0 : ( (-1)-((1<<(32-masklen))-1) );
像这个,虽然结果一样,不过不够直观,看着也别扭