В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Известно, что в составе сети, которой принадлежит IP-адрес 147.222.199.75, есть узел, в IP-адресе которого первый байт совпадает с четвёртым, а второй — с третьим.
Укажите наименьшее возможное количество принадлежащих этой сети IP-адресов, в двоичной записи которых ровно
Запишем второй узел, в IP-адресе которого первый байт совпадает с четвёртым, а второй — с третьим: 147.222.222.147.
Выпишем двоичное представление IP-адресов:
147.222.199.75: 10010011.11011110.11000111.01001011,
147.222.222.147: 10010011.11011110.11011110.10010011.
Заметим, что IP-адреса различаются в третьем байте слева. Отличие
255.255.224.0: 11111111.11111111.11100000.00000000.
В части IP-адресов,
Наименьшее возможное количество принадлежащих этой сети IP-адресов, в двоичной записи которых ровно
Ответ: 78.
Примечание.
В маске после нуля идут только одни нули.
Приведём решение Валерия Кабаладзе на языке Python.
from ipaddress import *
ipu = '147.222.199.75'
ipu_m = ipu[0:8] + ipu[4:8] + ipu[0:3]
for mask in range(32, 0, -1):
try:
net = ip_network(f'{ipu}/{mask}',0)
c = 0
if ip_address(f'{ipu_m}') in net:
for ip in net:
ipb = f'{ip:b}'
if ipb.count('1') == 14:
c+=1
if c > 0:
print(c)
break
except:
break
Приведём решение Данила Шарлова на языке Python.
from ipaddress import ip_network, ip_address
ipu = '147.222.199.75'
ipu_modified = '147.222.222.147'
for mask in range(32, 0, -1):
network = ip_network(f'{ipu}/{mask}', 0)
count = 0
if ip_address(ipu_modified) in network:
for ip in network:
if bin(int(ip)).count('1') == 14:
count += 1
if count > 0:
print(count)
break
Приведём решение Бориса Савельева на языке Python.
from itertools import product
s=product('01',repeat = 13)
k=0
for i in s:
if (12+i.count('1'))==14:
k+=1
print(k)
Приведём решение Юрия Красильникова на языке Python.
import ipaddress,math
s1 = bin(int(ipaddress.ip_address('147.222.199.75')))[2:].zfill(32) # Двоичное представление 1-го ip-адреса
s2 = bin(int(ipaddress.ip_address('147.222.222.47')))[2:].zfill(32) # Двоичное представление 2-го ip-адреса
for l in range(32):
if s1[l] != s2[l]: break # l - максимальная длина адреса сети (до первого несовпадающего бита)
k = 14-s1[:l].count('1') # количество единиц в номере узла
dnu = 32-l # длина номера узла
print(math.comb(dnu,k)) # число сочетаний из dnu по k

