Задание 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.

13 пример программы с параметром А

Ответ

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

Яндекс.Метрика