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