В интернете есть множество примеров кода который позволяет сделать необходимые преобразования, например, по
линку есть примеры на 5 разных ЯП, приведу сюда пример на Java
Javapublic static List<String> iprange2cidr( int ipStart, int ipEnd ) {
long start = ipStart;
long end = ipEnd;
ArrayList<String> result = new ArrayList<String>();
while ( end >= start ) {
byte maxSize = 32;
while ( maxSize > 0) {
long mask = iMask( maxSize - 1 );
long maskBase = start & mask;
if ( maskBase != start ) {
break;
}
maxSize--;
}
double x = Math.log( end - start + 1) / Math.log( 2 );
byte maxDiff = (byte)( 32 - Math.floor( x ) );
if ( maxSize < maxDiff) {
maxSize = maxDiff;
}
String ip = long2ip(start);
result.add( ip + "/" + maxSize);
start += Math.pow( 2, (32 - maxSize) );
}
return result;
}
private static long iMask(int s) {
return Math.round(Math.pow(2, 32) - Math.pow(2, (32 - s)));
}
private static long ip2long(String ipstring) {
String[] ipAddressInArray = ipstring.split("\\.");
long num = 0;
long ip = 0;
for (int x = 3; x >= 0; x--) {
ip = Long.parseLong(ipAddressInArray[3 - x]);
num |= ip << (x << 3);
}
return num;
}
private static String long2ip(long longIP) {
StringBuffer sbIP = new StringBuffer("");
sbIP.append(String.valueOf(longIP >>> 24));
sbIP.append(".");
sbIP.append(String.valueOf((longIP & 0x00FFFFFF) >>> 16));
sbIP.append(".");
sbIP.append(String.valueOf((longIP & 0x0000FFFF) >>> 8));
sbIP.append(".");
sbIP.append(String.valueOf(longIP & 0x000000FF));
return sbIP.toString();
}
Код понятен, почти весь, во всех найденных мной примерах есть куски кода:
double x = Math.log( end - start + 1) / Math.log( 2 );
byte maxDiff = (byte)( 32 - Math.floor( x ) );
if ( maxSize < maxDiff) {
maxSize = maxDiff;
}
Но нигде нет объяснения, что за математика тут происходит и как натуральные логарифмы связаны со всей этой темой.
Объясните, пожалуйста, что тут происходит?