В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули. Обычно маска записывается по тем же правилам, что и IP-адрес, — в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Для узла с IP-адресом 93.138.164.49 адрес сети равен 93.138.160.0. Для скольких различных значений маски это возможно?
Запишем третий байт IP-адреса и адреса сети в двоичной системе счисления:
16410 = 1010 01002,
16010 = 1010 00002.
Заметим, что
1110 00002,
1111 00002,
1111 10002.
1111 11002 — не подходит, поскольку в результате конъюнкции третьего байта IP-адреса и маски должно получиться 1010 00002.
Таким образом, для трёх различных значений маски адрес сети для узла с IP-адресом 93.138.164.49 равен 93.138.160.0.
Ответ: 3.
Приведём решение Ивана Новикова на языке Python.
from ipaddress import *
cnt = 0
for mask in range(33):
net = ip_network(f'93.138.164.49/{mask}' , 0)
if str(net) == f'93.138.160.0/{mask}':
cnt += 1
print(cnt)

