#!/usr/bin/perl -w use strict; sub output { my( $nLow, $cBits )= @_; my $ipLow= join ".", unpack "C*", pack "N", $nLow; print " $ipLow/$cBits\n"; } while( ) { my( $ipMin, $ipMax )= split " ", $_; print "$ipMin - $ipMax:\n"; my $nMin= unpack "N", pack "C*", split /\./, $ipMin; my $nMax= unpack "N", pack "C*", split /\./, $ipMax; my $bitsMin= 1; my $maskMin= 1; my $bitsMax= 1; my $maskMax= 1; while( 1 ) { while( 0 == ( $nMin & $maskMin ) ) { ( $maskMin <<= 1 ) |= 1; $bitsMin++; } last if $nMax < ( $nMin | $maskMin ); output( $nMin, $bitsMin-1 ); ( $nMin |= $maskMin ) += 1; } while( 1 ) { while( $maskMax == ( $nMax & $maskMax ) ) { ( $maskMax <<= 1 ) |= 1; $bitsMax++; } $nMax &= ~$maskMax; last if $nMax < $nMin; output( $nMax--, $bitsMax-1 ); } } __END__ 192.168.0.0 192.168.255.255 192.168.1.17 192.168.112.26