Узел имеет IP-адрес 192.168.112.145. Маска сети равна 255.255.240.0...
Задание
Узел имеет IP-адрес 192.168.112.145. Маска сети равна 255.255.240.0. Определите адрес сети и в ответе запишите сумму числовых значений октетов полученного адреса сети.
Решение
net = ip_network('192.168.112.145/255.255.240.0', 0)
print(net)
Разбор кода. Модуль ipaddress умеет работать с IP-адресами и масками как с объектами. Функция ip_network('192.168.112.145/255.255.240.0', 0) принимает адрес узла вместе с маской в виде «адрес/маска» и возвращает объект сети. Второй аргумент 0 означает strict=False — он разрешает передавать адрес узла (а не строго адрес сети), и функция сама «затрёт» хостовую часть по маске. Команда print(net) выводит адрес сети в формате CIDR.
Адрес сети получается побитовым «И» между адресом узла и маской. Для наглядности:
| 1-й октет | 2-й октет | 3-й октет | 4-й октет | |
|---|---|---|---|---|
| IP-адрес | 192 | 168 | 112 | 145 |
| Маска | 255 | 255 | 240 | 0 |
| Адрес сети | 192 | 168 | 112 | 0 |
Побитовое «И» для первых двух октетов ничего не меняет (маска 255 сохраняет все биты). В третьем октете маска 240 = 111100002 обнуляет младшие 4 бита, но у числа 112 = 011100002 эти биты уже равны нулю, поэтому третий октет не меняется. Четвёртый октет полностью обнуляется маской 0. Адрес сети — 192.168.112.0.
Ключевой момент: второй аргумент 0 в ip_network — это strict=False. Без него функция выдала бы ошибку, потому что 192.168.112.145 не является адресом сети. С strict=False библиотека сама применяет маску и возвращает корректный адрес сети.
Сумма октетов: 192 + 168 + 112 + 0 = 472
Ответ: 472