Considering this:
In this challenge, these subnet masks are also considered invalid:
255.255.255.255 (11111111 11111111 11111111 11111111)
0.0.0.0 (00000000 00000000 00000000 00000000)
"Trick" solution:
Code: Select all
function isValidIPv4Mask($mask)
{
$n = ip2long($mask);
return $n===false ? $n : !(~($n-1) & ~($n));
}
But of course the "boring" solution is faster:
Code: Select all
$s_ValidMasks = Array(
'255.255.255.255' => true,
'255.255.255.254' => true,
'255.255.255.252' => true,
'255.255.255.248' => true,
'255.255.255.240' => true,
'255.255.255.224' => true,
'255.255.255.192' => true,
'255.255.255.128' => true,
'255.255.255.0' => true,
'255.255.254.0' => true,
'255.255.252.0' => true,
'255.255.248.0' => true,
'255.255.240.0' => true,
'255.255.224.0' => true,
'255.255.192.0' => true,
'255.255.128.0' => true,
'255.255.0.0' => true,
'255.254.0.0' => true,
'255.252.0.0' => true,
'255.248.0.0' => true,
'255.240.0.0' => true,
'255.224.0.0' => true,
'255.192.0.0' => true,
'255.128.0.0' => true,
'255.0.0.0' => true,
'254.0.0.0' => true,
'252.0.0.0' => true,
'248.0.0.0' => true,
'240.0.0.0' => true,
'224.0.0.0' => true,
'192.0.0.0' => true,
'128.0.0.0' => true,
'0.0.0.0' => true,
);
function isValidIPv4Mask($mask)
{
global $s_ValidMasks;
return isset($s_ValidMasks[$mask]);
}