
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места – нули.
Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Известно, что в двоичной записи адреса сети, к которой принадлежит узел 169.25.132.59, содержится столько же единиц, сколько нулей в двоичной записи маски этой сети.
Сколько адресов, в двоичной записи которых ровно 11 единиц, содержится в этой сети?
Решение.
Это задание ещё не решено, приводим решение прототипа.
В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули.
Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Известно, что в двоичной записи адреса сети, к которой принадлежит узел 68.30.20.77, содержится столько же единиц, сколько нулей в двоичной записи маски этой сети.
Сколько адресов, в двоичной записи которых ровно 10 единиц, содержится в этой сети?
Приведём решение на языке Python.
from ipaddress import *
for mask in range(32, -1, -1):
net = ip_network(f'68.30.20.77/{mask}',0)
if bin(int(net[0])).count('1') == 32 - mask:
count = 0
for ip in net:
if bin(int(ip)).count('1') == 10:
count += 1
print(count)
Ответ: 28.
Приведём аналитическое решение Юрия Красильникова.
Адрес сети в двоичном виде содержит 12 единиц и выглядит так:
01000100000111100001010001001101
Количество нулей в маске, которое будет равно количеству единиц в адресе сети - это 8:
01000100000111100001010001001101
11111111111111111111111100000000
Требуемый в условии IP-адрес должен содержать 10 единиц: 8 в адресе сети и 2 в номере узла.
Число способов расставить две единицы на 8 мест - это число сочетаний из 8 по 2.
8*7/(1*2)=28
Приведём решение Юрия Красильникова на языке Python.
import ipaddress,math
s = bin(int(ipaddress.ip_address('68.30.20.77')))[2:].zfill(32) # Двоичное представление адреса сети
for l in range(32):
if s[:32-l].count('1') == l: break # l - количество нулей в маске
print(math.comb(l,10-l)) # число сочетаний