Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 162.121.95.80 и маской сети 255.255.255.240.
Определите максимальную сумму единиц в двоичной записи IP-адреса в этой сети.
В ответе укажите только число.
Правильный ответ
20
Пояснение
Решение:
В маске 255.255.255.240 ровно единиц, и 80 & 240 = 80, поэтому адрес сети — 162.121.95.80, а свободными остаются последние бита.
Первые 28 битов одинаковы у всех адресов сети: 1010001001111001010111110101, и в них 16 единиц — это неснижаемый вклад. Больше всего единиц будет у того адреса, у которого все 4 свободных бита равны единице; такой адрес в сети действительно есть — это 162.121.95.95. Значит максимальная сумма единиц равна .
ip = [162, 121, 95, 80]
mask = [255, 255, 255, 240]
def to_int(a):
return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]
n, m = to_int(ip), to_int(mask)
base = n & m
host = 32 - bin(m).count('1')
best = 0
for i in range(2 ** host):
s = bin(base + i)[2:].zfill(32)
best = max(best, s.count('1'))
print(best)Ответ: 20