Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Для узла с IP-адресом 171.5.220.205 адрес сети равен 171.5.220.0.
Каково наибольшее возможное количество нулей в двоичной записи маски?
В ответе укажите только число.
Правильный ответ
10
Пояснение
Решение:
В маске 32 бита: единиц подряд, затем нулей. Нулей будет как можно больше, когда единиц как можно меньше, поэтому ищем наименьшее допустимое .
Все единицы адреса сети должны сохраниться после наложения маски. Третий байт адреса сети равен ; самая правая единица всего адреса сети стоит именно в нём, на шестой позиции байта, то есть это 22-й бит адреса. Он обязан попасть в единичную часть маски: .
Ограничение сверху даёт четвёртый байт: число 205 должно обнулиться целиком, откуда . Значит может быть 22, 23 или 24; наименьшее — 22, маска 255.255.252.0, и действительно .
Количество нулей в маске равно .
def to_int(s):
v = 0
for byte in s.split('.'):
v = v * 256 + int(byte)
return v
ip = to_int('171.5.220.205')
net = to_int('171.5.220.0')
ok = [k for k in range(33)
if ip & (((1 << k) - 1) << (32 - k)) == net]
print(ok, 32 - min(ok)) # [22, 23, 24] -> 10Ответ: 10