Задание №13 — Маски подсети
В терминологии сетей ТСР/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 191.239.130.3 и маской сети 255.255.А.0, где А — некоторое допустимое для записи маски число. Определите минимальное значение А, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах. В ответе укажите только число.
Правильный ответ
224
Пояснение
Решение:
Левые два байта у всех адресов сети одинаковы: даёт 7 единиц, даёт 7. Значит при любом адресе сети.
Маска 255.255..0 фиксирует старшие разряды третьего байта: если в ровно единиц, то в третьем байте свободны младших битов, а четвёртый байт свободен целиком. Наибольшее число единиц в правых двух байтах равно
где — число единиц в двоичной записи ; здесь . Условие «для всех адресов » означает .
Перебираем допустимые значения байта маски, начиная с меньших:
- (): , одна единица, — не подходит;
- (): , одна единица, — подходит.
ones = lambda x: bin(x).count('1')
for A in [0, 128, 192, 224, 240, 248, 252, 254, 255]:
free = 8 - ones(A)
if ones(191) + ones(239) >= ones(130 & A) + free + 8:
print(A) # 224
break
Ответ: 224