Задание 13 ЕГЭ по информатике: решайте с автопроверкой
Задание 13 о сетях. По адресу узла и маске нужно найти адрес сети, число адресов в сети, количество подходящих масок или адресов с особым свойством, например с числом единиц, кратным заданному.
Решать задачи номераКак решать программой
В Python есть модуль ipaddress, который знает правила адресации. ip_network("адрес/маска", strict=False) строит сеть по адресу узла, а у сети есть адрес сети, широковещательный адрес, число адресов и перебор всех адресов.
Если удобнее работать с битами, переведите адрес в 32-битное число: каждый байт сдвигается на 8 разрядов. Адрес сети — это поразрядное И адреса и маски, а маска с k единицами — это (2³² − 1) − (2^(32 − k) − 1).
Число адресов, которые можно выдать узлам, на два меньше размера сети: адрес сети и широковещательный адрес узлам не назначают. Внимательно читайте, о каком числе спрашивают.
Задачи о количестве масок решаются перебором: масок всего 33, от нуля единиц до тридцати двух. Для каждой проверьте, что оба узла попадают в одну сеть, то есть их адреса сети совпадают.
Разбор примера
Узел 172.30.140.9, маска 255.255.240.0. Сколько адресов этой сети можно назначить узлам?
from ipaddress import ip_network
net = ip_network('172.30.140.9/255.255.240.0', strict=False)
print(net.num_addresses - 2)Программа печатает
4094
В маске 255.255.240.0 двадцать единиц и двенадцать нулей. Значит, в сети 2¹² = 4096 адресов, а узлам можно назначить на два меньше: 4094.
Решить эту задачуЗадачи к заданию 13
- Сколько узлов поместится в сетиЛёгкаяРешать
- Адреса сети с кратным числом единицСредняяРешать
- Сколько масок подходит двум узламСредняяРешать
- Сколько единиц может быть в маскеСредняяРешать
- Последний адрес узла в сетиЛёгкаяРешать
- Адреса сети с суммой байтов, кратной dСредняяРешать
Бесплатно и без регистрации: пишете код в браузере и проверяете его тестами (без аккаунта — несколько задач в день).
Вопросы и ответы
- Можно ли пользоваться модулем ipaddress на экзамене?
- Да: модуль входит в стандартную библиотеку Python и есть в любой установке. Решение битами тоже стоит знать, оно работает на любом языке.
- Зачем strict=False?
- Без него ip_network ждёт адрес сети, а не адрес узла, и выдаёт ошибку.
- Как посчитать единицы в адресе?
- Переведите адрес в число и возьмите bin(n).count("1").
- Как перевести адрес в число без модуля?
- Разбейте строку по точкам и соберите число: каждый следующий байт добавляется после сдвига на 8 разрядов влево, то есть умножения на 256.