Задание 13
Пример 1
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 255.211.33.160 и маской сети 255.255.A.0, где A - некоторое допустимое для записи маски число. Определите минимальное значение A, для которого для всех IP-адресов сети в двоичной записи IP-адреса суммарное количество единиц в левых двух байтах не менее суммарного количества единиц в правых двух байтах.
В ответе укажите только число.
Теория
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес, - в виде 4 байтов, причем каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и его маске.
Например, Сеть задана IP-адресом 58.27.142.224 и сетевой маской 255.255.255.240. Важно, что в маске сети если встречается нулевой бит =0, то все биты правее тоже 0.
| Адрес сети | 58.27.142.224 | 00111010 | 00011011 | 10001110 | 11100000 |
| Маска | 255.255.255.240 | 11111111 | 11111111 | 11111111 | 11110000 |
| IP | 58.27.142.240-255 | 00111010 | 00011011 | 10001110 | 1110xxxx |
В результате получаем возможные IP-адреса в сети - в данном примере их 16 = 24. Например задача: Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса кратно 2? Подсчитав количество единиц слева от хххх получили 15 единиц - нечетное, значит на месте хххх или одна (4 варианта) или три единицы (тоже 4 варианта), а всего 8.
Обратите внимание, что в спецификации ЕГЭ по Информатике примерное время решения - 3 минуты. Программировать ли эту задачу - решайте сами.
Решение
Пример 1
Аналитический способ
Самый быстрый способ решения данной задачи это аналитический. С помощью калькулятора быстро переведите IP-адрес сети и маску сети в двоичную систему счисления и выполните поразрядную конъюнкцию.
| Адрес сети | 255.211.33.160 | 11111111 | 11010011 | 00100001 | 10100000 |
| Маска | 255.255.240.0 | 11111111 | 11111111 | 11110000 | 00000000 |
| IP | 58.27.142.240-255 | 11111111 | 11010011 | 0010xxxx | xxxxxxxx |
В левых двух байтах IP-адресов этой сети 13 единиц. Правый байт (четвертый) может содержать максимум 8 единиц. Значит 3-й байт не может содержать более 5 единиц, следовательно 3-байт маски минимум может быть 240 (255 - 15 = 240). Проверка. Если 3-й байт содержит все 0 (8 нулей), то максимальное количество единиц в 3-м и 4-м байтах - 16. Аналогично проверяем число 128, 192 и 224. По таблице видно, что в 3-м байте маски обязательно должны быть 4 единицы, а далее 4 нуля - это минимальное число. Если число 22410 = 111000002 (3 единицы и 5 нулей) то максимальное количество единиц будет 14. Результат 240.
Программа
Только в качестве примера с помощью модуля ipaddress Python. Применяйте программирование только там, где без него не обойтись, т.к. программу необходимо отладить и протестировать!
from ipaddress import *
A = []
for i in range(9): #список возможных значений 3-го байта маски
Abin = i*'1'
Abin = Abin.zfill(8)
A.append(''.join(reversed(Abin)))
print(A)
for i in range(9):
net = ip_network(f'255.211.33.160/255.255.{int(A[i],2)}.0', strict=False)
n=0
for ip in net:
n += 1
bytes = str(ip).split('.')
for j in range(4):
bytes[j] = int(bytes[j])
#подсчет единиц в левых двух и в правых двух байтах адреса
#с максимальным количеством единиц
left2bytes = bin(bytes[0])+bin(bytes[1])
right2bytes = bin(bytes[2])+bin(bytes[3])
print(A[i], int(A[i],2), left2bytes.count('1'), right2bytes.count('1'))
Результат 240.

Ответ
Пример 1: 240 (Время не более 3 минут)