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