Вам нужно понимать двоичные числа, не более того.
Блок CIDR - это не что иное, как серия двоичных чисел с общим префиксом и со всеми возможными суффиксами .
Предположим, что для примера ниже у нас было 8-битные IP-адреса с классами /1
, ... до /8
.
В вашем случае (игнорируя 1.1.1 на данный момент) мы запишем ваши числа в виде двоичных чисел:
1101111 - 111
1110000 - 112
1110001 - 113
...
1110110 - 118
1110111 - 119
1111000 - 120
Вы увидите, что все числа имеют общий префикс 11
, но наш список не содержит всех этих чисел. Таким образом, мы должны разделить его на два списка - один с 110
и один с 111
. Первый содержит только одно число, поэтому мы делаем из него блок /8
(111/8
).
Другой список (от 112 до 120) содержит не все числа с 111
(с тех пор он увеличится до 127), поэтому мы снова разделим - один список с 1110
, другой с 1111
. Первый - теперь полный блок 1110????
(или 112/4
), второй - только один адрес, а именно 11111000
(или 120/8
).
Итак, теперь расширяйте только до 32 бит вместо 8 и внедряйте в Java, и вы готовы.
В математических терминах один блок всегда идет от x * 2 ^ n до (x + 1) * 2 ^ n - 1 , и тогда мы используем 32 - n в качестве суффикса размера блока. Таким образом, вам нужно только найти следующий кратный некоторой степени двойки.