@ary = map { pack "B32", join "", (1) x $_, (0) x (32 - $_) } 0..31; print unpack("B*",$_),"\n" for @ary; #### $#ary = 31; # create an array of 32 empty slots $c = 0; vec($_,0,32) = ~((1<<++$c)-1) for @ary; @ary = reverse @ary; # another way without $c vec($ary[31+$_],0,32) = ~((1<<(-$_+1))-1) for -31..0; print unpack("B*",$_),"\n" for @ary; #### @ary = map { pack "B32", join "", (1) x $_, (0) x (32 - $_) } 0..31; $dotted = "192.168.248.17"; $netmask = $ary[19]; # prefix 19, i.e. cidr 192.168.248.17/19 $address = pack "C4", split /\./, $dotted; $network = $address & $netmask; $broadcast = $address | ~ $netmask; print $_,$/ for map { join ".", unpack "C4", $_ } $netmask, $address, $network, $broadcast; __END__ 255.255.224.0 192.168.248.17 192.168.224.0 192.168.255.255 #### #!/usr/bin/perl # file cidr $m=pack B32,pop=~'/'x$';printf"$` network %vd broadcast %vd netmask %vd\n",($z=eval$`)&$m,$z|~$m,$m #### qwurx [shmem] ~> cidr 192.168.248.17/19 192.168.248.17 network 192.168.224.0 broadcast 192.168.255.255 netmask 255.255.224.0