Форум » Адресация в Интернете » № 11791 (Уровень: Базовый) (М. Ишимов) » Ответить

№ 11791 (Уровень: Базовый) (М. Ишимов)

Anna1915: В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть, в которой содержится узел с IP-адресом 246.51.128.202, задана маской сети 255.255. A.0, где A - некоторое допустимое для записи маски число. Определите минимальное значение A, для которого для всех IP-адресов этой сети в двоичной записи IP-адреса суммарное количество нулей в левых двух байтах не более суммарного количества нулей в правых двух байтах. [pre2] from ipaddress import * from fnmatch import * ip = ip_address('246.51.128.202') for mask in range(33): network = ip_network(f'{ip}/{mask}', 0) if fnmatch(str(network.netmask), '255.255.*.0'): if ip not in [network.network_address, network.broadcast_address]: if all(f'{ip:b}'[:16].count('0') <= f'{ip:b}'[16:].count('0') for ip in network): print(network.netmask) [/pre2] ВОПРОС ЧТО ПРОВЕРЯЕТ ЭТО СТРОКА if ip not in [network.network_address, network.broadcast_address]:

Ответов - 2

Anna1915: Может быть такое, что здесь проверяют что это не адрес сети и не широковещательный адрес, типо это служебные адреса. Здесь есть логика? Когда всё нули или все единицы в адресе узла сети, типо их исключили, что думаете?

Ж: Мои мысли на этот счет: В тексте не сказано, что эти адреса не должны быть учтены. Кроме того ip = ['11110110', '00110011', '10000000', '11001010'] - видно, что он не является ни широковещательным (были бы сплошные единицы в конце IP над нулями маски ['11111111', '11111111', '********', '00000000'], т.е. как минимум 8 штук)), ни адресом сети( были бы нули в конце IP над нулями маски - тоже 8 штук) Если уж проверять, то здесь: if all(f'{int(ip):b}'.zfill(32)[:16].count('0') <= f'{int(ip):b}'[2::].zfill(32)[16:].count('0') for ip in network if ip not in [network.network_address, network.broadcast_address] ) Но в этом случае ответ неверен, т.к. , повторюсь, в тексте не сказано, что эти адреса не должны быть учтены. Как мне видится, это рабочий код, который выдает верный ответ. [pre2] from ipaddress import * ip = ip_address('246.51.128.202') for mask in range(16,32): network = ip_network(f'{ip}/{mask}', 0) if all(f'{int(ip):b}'.zfill(32)[:16].count('0') <= f'{int(ip):b}'[2::].zfill(32)[16:].count('0') for ip in network): print(network.netmask,network) break [/pre2] Еще надо обязательность доводить разрядность байтов до 8 с помощью функции zfill(32), иначе байты неполные могут быть.



полная версия страницы