В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Узел с IP-адресом 121.96.174.205 принадлежит сети, в которой 10 IP-адресов, двоичная запись которых содержит ровно 12 единиц.
Сколько единиц содержится в двоичной записи маски этой сети?
Выпишем IP-адрес двоичной системе счисления:
121.96.174.20510 = 0111 1001. 0110 0000. 1010 1110. 1100 11012,
В первых 3 байтах адреса содержится 12 единиц. Заметим, 11 единиц содержится в первых 22 битах двоичной записи IP. Для того, чтобы было 10 IP-адресов с 12 единицами, должно оставаться 10 последних битов. Следовательно, маска будет иметь:
1111 1111. 1111 1111. 1111 1100. 0000 00002.
Получаем 22 единицы содержится в двоичной записи маски этой сети.
Ответ: 22.
Приведём решение Ивана Новикова на языке Python.
from ipaddress import *
for mask in range(15 , 33):
cnt = 0
net = ip_network(f'121.96.174.205/{mask}' , 0)
for ip in net:
if bin(int(ip)).count('1') == 12:
cnt += 1
if cnt == 10:
print(mask)

