Есть адрес сети 192.168.01.0, нужно разбить на 20 подсетей с максимально возможным количеством узлов. Как выбрать маску?
Для адреса сети 192.168.1.0 обычно используется маска 24 (т.е. 255.255.255.0), хотя было бы не плохо, чтоб в условии задачи была явно задана маска. 
Что бы поделить эту подсеть на 20 подсетей нужно увеличить маску на несколько бит. Число 20 может быть представлено минимум 5 битами. Поэтому увеличиваем маску на 5 бит. Получаем маску 29 (24+5) (т.е. 255.255.255.248). Количество хостов в каждой из 32, поучившихся подсетей максимум 8 (но т.к. 0 и последний адрес являются широковещательными, то на самом деле их 6).
Примеры получившихся подсетей:
192.168.1.0/29 - адреса хостов: 192.168.1.0 - 192.168.1.7
192.168.1.128/29 - адреса хостов: 192.168.1.128 - 192.168.1.135
192.168.1.168/29 - адреса хостов: 192.168.1.168 - 192.168.1.175
192.168.1.248/29 - адреса хостов: 192.168.1.248 - 192.168.1.255
Подсетей получилось 32, а не 20, т.е. 12 подсетей будет не использовано. На практике обычно бывает, что есть дополнительные условия. Например некоторые из 20 подсетей имеют больше 6 хостов, но в большинстве подсетей 2-3 хоста. В этом случае можно оптимизировать деление на подсети - использовать не равномерное разделение (одна маска), а разную длину маски для разных подсетей в зависимости от дополнительных условий.
Вот примеры, не понимаю логики
Чтобы понять нужно знать, какова маска исходной заданной сети. Для сети 192.168.8.0 маска -- 24 бита, для сети 172.27.0.0.маска -- 16 битов. Количество дополнительных битов должно быть таким, чтобы представить столько сетей сколько задано. Для 20 ближайшая степень двойки -- 32, т.е. потребуется 5 дополнительных битов.