
Привет! Я Вика Ланская, готовлю к ЕГЭ по информатике в онлайн-школе «Умскул».

Мы вычислили тебя по айпи… Ладно, шутим. Раз ты на этой странице, значит, хочешь разобраться в заданиях на IP-адреса. Делимся подробным гайдом по решению задачи №13, которая встретится на ЕГЭ.
Термины
Для начала кратко пробежимся по теории.
IP-адрес — это уникальный адрес конкретного компьютера. Он состоит из двух частей: адреса сети и хоста (адреса узла). IP-адрес содержит 4 байта, или 4 октета.
Пример: 11110000.00010110.01111011.00001100.
Адрес сети — это первая часть IP-адреса, которая наряду с маской подсети определяет остальные компоненты. Состоит из четырёх чисел, принимающих значения от 0 до 255.
Пример: 192.168.8.0 или 11000000.10101000.00001000.00000000.
Хост (адрес узла) — это последняя часть IP-адреса, конкретный номер компьютера. Определяется также с помощью маски подсети.
Маска подсети состоит из четырёх байтов. Главная особенность: в начале всегда идут только единицы, а за ними уже только нули. Маска помогает определить по адресу узла, что такое сеть, а что такое номер компьютера.
Пример: 255.255.248.0 или 11111111.11111111.11111000.00000000.
Возникает логичный вопрос: зачем нужна маска? Допустим, у нас есть адрес. Адрес есть у каждого человека — обычно это номер дома и квартиры. Дом у тебя и соседей один, общий, а номер квартиры у каждого человека индивидуален. То же и с IP-адресом узла: у него есть адрес сети (общий для всех, кто находится в этой сети) и адрес компьютера (лично твой).
Представим, что у нас есть дом и квартира. Какой-то человек запутался и записал всё подряд. И где что — неизвестно. Чтобы различить эти два числа и нужна маска. Её мы накладываем на запись и по битам умножаем.
Пример: если мы возьмём число 11233, непонятно, где «дом», а где «квартира». Тогда мы накладываем маску на запись и умножаем. 11100 — маска означает, что первые три цифры — дом, а следующие — номер квартиры.
Разбор задания №13
Теорию вспомнили, теперь к практике! Рассмотрим один из примеров задачи №13 из демоверсии 2024 года.
Чтобы решить эту задачу, можно воспользоваться встроенной библиотекой ipaddress в Питоне. Мы пишем: from ipaddress import *
С помощью библиотеки мы создадим сеть и с помощью цикла for будем проходиться по этой сети. Цикл for на каждой операции будет возвращать какой-то адрес, который находится в данной сети. Грубо говоря, наш цикл for — это создание дома и прохождение по всем квартирам, которые есть.
Создаём переменную. Она может называться как угодно: ip_net, ip_dosvidaniya, ip_vika. Тут всё на твоё усмотрение! Затем ставим знак равенства и вызываем необходимую функцию: ip_network.
Чтобы создать адрес сети, сначала переписываем непосредственно IP-адрес. В нашем случае это 192.168.32.176.
Затем нам нужно передать маску. Ставим слеш (/), а затем вписываем маску сети: 255.255.255.240.
Далее пишем сеть — print(ip_net) — и получаем следующий вид:
Смотрим на число 28. Дело в том, что иногда маску представляют через определённое число единиц. В данном случае каждое число 255 — это 8 единиц. А число 240 — это четыре единицы и четыре нуля. То есть четыре единицы.
8 + 8 + 4 + 8 — это как раз 28. То есть маску можно задавать либо через четыре числа, либо через количество суммарных единиц в этой маске.
Кстати, важно отметить, что если ты строишь IP-адрес на основе адреса узла сети (192.168.32.176), то нолик всегда можно оставить — мы ничего не сломаем.
Переходим к решению. Нас спрашивают, сколько в этой сети IP-адресов. Давай пройдемся по «квартирам» нашего «дома», то есть по ip_net. Питон позволяет нам это провернуть.
В следующей строке пишем print(ip_add) и, если идём далее, видим, что мы действительно перебираем все IP-адреса в данной сети.
Но нам нужно получить двоичную запись. Предлагаем ультимативный способ.
Есть такое понятие, как f-строки. Что такое f-строка? Давай введём какое-то значение (например, а = 10) и вызовем f-строчку с помощью комбинации print(f»kak dela ckok te let {a}»). Тогда сюда подставляется значение переменной. То есть через f-строчку можно подставлять значение переменной.
Обязательно используй фигурные скобки, чтобы получить переменную, — иначе будет печататься просто строка.
f-строка — интересный и многофункциональный элемент. А ещё с её помощью можно показать, в каком виде ты хочешь напечатать данную переменную:
Можно написать двоеточие — b (a:b). Тогда программа возьмёт это число, переведёт его в двоичный вид и напечатает в двоичном виде:
На IP-адресации это тоже работает. Попробуем передать в f-строчку значение переменной ip_add, но переведём его в двоичный формат с помощью комбинации print(f“{ip_add:b}“):
Отлично! Теперь остаётся просто проверить условия. Узнаём сумму единиц. Если количество единиц нечётное, то мы к cnt прибавляем 1. Изначально cnt = 0.
По итоговому коду получается 8. Мы проходимся по всем IP-адресам сети. Если количество единиц в нашем айпи-адресе не кратно двум, увеличиваем значение переменной cnt на единицу. То есть подсчитываем, сколько раз нам встретилось нечётное количество единиц в адресе сети. Вся комбинация на скрине:
Закрепим всё на примере следующей задачи.
Она из ЕГЭ 2024 года. Суть такая же: опять забили в библиотеку ipaddress, создаём сеть, передаём её: ip_net = ip_network(«172.16.168.0/255.255.248.0»):
Так как нас спрашивают про количество адресов, вводим переменную — счётчик cnt = 0.
Проходимся по IP-адресам: for ip_add in ip_net: (ip_add — это просто переменная, её можно назвать по-разному, мы назвали ip_add).
Затем нужно проверить эту строчку. Создаём f-строку, в фигурных скобках оставляем ip_add, берём двоичную запись и смотрим количество единиц. То есть count(«1») должно быть не кратно 5. Если это так, то к cnt просто прибавляем 1. Получаем следующий результат:
Посмотрим ещё одну задачку. Она не из ЕГЭ, а из сборника Крылова. Здесь снова есть сеть, она задана от IP-адреса узла. До этого нам был сразу дан адрес сети, а здесь его нет в условиях задачи.
ip_net = ip_network(«252.67.33.87/255.248.0.0», 0). Не забываем про нолик в конце, иначе ничего не получится: в адресе узла больше цифр, так как часть из них отвечают за номер компьютера. Их нужно обрезать — ставим нолик в конце и не переживаем:
Теперь посчитаем, сколько в этой сети IP-адресов, подходящих по условию. Нам снова понадобится count (cnt). Вписываем его далее.
Давай снова перебирать IP-адреса.
Далее — f-строка, куда мы отдаём IP-адрес и приводим его к двоичной записи.
Но есть такой момент: в задаче спрашивают про правые два байта и левые два байта. Давай разберёмся. Левые два байта — первые два числа, правые — вторые два числа. 1 байт — это 8 бит. То есть это 8 цифр, если переводить их в двоичный вид.
В двоичном виде у нас всегда 32 цифры. Первые два байта — это 16 цифр, вторые — тоже 16. Получается, нужно наши 32 цифры разбить на 2.
Разберём левые два байта. С какого индекса начнутся первые два байта? Конечно, с нулевого — и до 16-го (не включая последний). Правые два байта — с 16 по 32 (не включая последний).
Идём дальше. Единицы в правых двух байтах начинаются с 16-го индекса. Как узнать количество единиц? Снова через count.
В условии задачи количество единиц — «более чем вдвое». Давай попробуем поделить количество единиц в правых двух байтах на количество единиц в левых двух байтах. Напоминаем, что в Питоне первое число пишется включительно, а второе — не включительно.
Если условие выполнится, то увеличим значение переменной cnt на единицу. Получаем следующий вид:
Отсюда мы получаем число 17, оно и будет нашим ответом.
Вот и всё. А ещё больше полезной информации ждёт тебя на курсах в онлайн-школе «Умскул». Записывайся, чтобы прокачаться на максимум: