Задание №10. Короткий конспект
Маска, адрес сети, последний узел и подсчёт единиц: формулы, порядок решения и проверка границ.
Адрес и маска
IPv4 — четыре октета по восемь битов. Маска содержит сначала единицы, затем нули. Единицы сохраняют сетевую часть адреса, нули отмечают свободные узловые биты. Число единиц маски — p, число нулей — h=32-p.
Побитовое И адреса A и маски M даёт адрес сети N=A\land M.
| Что требуется | Результат |
|---|---|
| Все адреса подсети | 2^h |
| Широковещательный адрес | B=N+2^h-1 |
| Последний адрес компьютера | B-1, если крайние адреса запрещены узлам |
| Число адресов компьютеров | 2^h-2 при тех же ограничениях и h\ge2 |
Сложение в формулах выполняется над целым 32-битным адресом. Адрес сети имеет нулевую узловую часть, широковещательный — единичную. Правило вычитания двух не применяется автоматически к /31, /32 или к вопросу обо всех адресах.
Порядок решения
- Фиксируется вопрос: сеть, последний узел или число адресов; отдельно — формат ответа.
- Маска определяет границу частей. Октет маски 255 сохраняет октет адреса; 0 обнуляет. В промежуточном октете выполняется побитовое И.
- Для последнего узла свободные биты сначала заполняются единицами, затем из целого адреса вычитается 1.
- Для подсчёта адресов перебирается весь диапазон сети и проверяется условие. Единицы считаются во всём адресе.
- Полученный адрес преобразуется в сумму октетов или запись без точек только по требованию условия.
Условие на единицы
В префиксе c единиц, в свободной части — j. Всего c+j; кратность k означает нулевой остаток от деления этой суммы на k.
Python: bin(int(address)).count('1') считает единицы. Цикл по net включает оба края; net.hosts() для обычной подсети их исключает. «Кратно» — ones % k == 0, «не кратно» — ones % k != 0.
При h\ge1 ровно половина всех адресов имеет чётное число единиц, половина — нечётное: по 2^{h-1}. Для делимости на 3, 4 или 5 такое деление пополам неверно.
Возможные ловушки
- Обнулён целый октет. В EGE-10-0097 ↗ 76\land240=64, а не 0: первые четыре бита сохраняются.
- Исключены края при подсчёте всех адресов. В EGE-13-0015 ↗ они оба подходят. Их удаление меняет правильный ответ 5 на 3.
- Пропущены единицы сети. В EGE-13-0010 ↗ к единицам свободных битов добавляются 8 единиц префикса; кратность проверяется после сложения.