В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули.
Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Узлы с IP-адресами 206.123.209.193 и 206.123.210.118 принадлежат одной сети. Какое наименьшее количество IP-адресов, в двоичной записи которых ровно 15 единиц, может содержаться в этой сети?
Приведём решение на языке Python.
from ipaddress import *
ip1 = ip_address('206.123.209.193')
ip2 = ip_address('206.123.210.118')
otv = []
for mask in range(15,33):
net = ip_network(f'206.123.209.193/{mask}', 0)
if (ip1 in net) and (ip2 in net):
count = 0
for ip in net:
if f'{ip:b}'.count('1') == 15:
count += 1
otv.append(count)
print(min(otv))
Ответ: 10.
Приведём решение Данила Шарлова на языке Python.
from ipaddress import ip_network, ip_address
ip_b = ip_address('206.123.210.118')
for mask in range(32, -1, -1):
net = ip_network(f'206.123.209.193/{mask}',0)
if ip_b in net:
print(sum(bin(int(ip)).count('1')==15 for ip in net))
break
Приведём решение Бориса Савельева на языке Python.
from itertools import product
a = product('01', repeat = 10)
k = 0
for i in a:
if i.count('1')+14==15:
k+=1
print(k)

