Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 165.238.125.16 и маской сети 255.255.255.240.
Определите минимальное количество нулей в двоичной записи IP-адреса в этой сети.
В ответе укажите только число.
Правильный ответ
11
Пояснение
Решение:
Единицы маски отмечают биты адреса сети, нули — биты адреса узла. В маске 255.255.255.240 = 11111111.11111111.11111111.11110000 ровно 28 единиц, поэтому у всех адресов этой сети совпадают первые 28 битов, а последние 4 бита свободны и дают адресов.
Находим адрес сети поразрядной конъюнкцией последнего байта: 16 & 240 = 00010000 & 11110000 = 00010000, то есть сеть 165.238.125.16. Её фиксированные 28 битов: 10100101.11101110.01111101.0001.
Считаем нули в этой неизменяемой части: в 165 = 10100101 их 4, в 238 = 11101110 — 2, в 125 = 01111101 — 2, в четырёх старших битах 0001 — 3, итого 11. Эти нули есть у каждого адреса сети. Оставшиеся 4 бита свободны, и чтобы нулей было как можно меньше, все их делаем единицами — получаем адрес 165.238.125.31, в двоичной записи которого ровно 11 нулей.
Проверка программой:
from itertools import product
def to_bits(s):
return ''.join(format(int(x), '08b') for x in s.split('.'))
ip = to_bits('165.238.125.16')
mask = to_bits('255.255.255.240')
k = mask.count('1')
head = ip[:k]
addrs = [head + ''.join(t) for t in product('01', repeat=32 - k)]
print(min(a.count('0') for a in addrs))
Ответ: 11