В терминологии сетей TCP/IP маской сети называется двоичное число, определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого места — нули.
Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Известно, что для узла 130.0.5.80 количество единиц в двоичной записи адреса сети равно количеству единиц в двоичной записи номера узла в пределах сети.
Какое наибольшее число узлов, адреса которых обладают тем же свойством (включая уже названный), может быть в этой сети?
Приведём решение на языке Python.
from math import *
for i in range(32):
ip = (130 << 24) | (0 << 16) | (5 << 8) | (80 << 0)
mask = (2**i - 1) << (32 - i)
if f'{ip & mask:b}'.count('1') == f'{ip & (2**(32 - i) - 1):b}'.count('1'):
print(comb(32 - i, f'{ip & mask:b}'.count('1')))
Ответ: 120.
Приведём решение Бориса Савельева на языке Python.
from itertools import product
s=product('01', repeat = 10)
k=0
for i in s:
if i.count('1')==3:
k+=1
print(k)
Приведём аналитическое решение Юрия Красильникова.
Ip-адрес в двоичном представлении содержит шесть единиц и выглядит так:
10000010000000000000010101010000
Разобьем его на две части по три единицы в каждой так, чтобы правая часть была максимально длинной:
1000001000000000000001_0101010000
Правая часть имеет длину 10.
Число способов расставить три единицы на 10 мест - это число сочетаний из 10 по 3.
10*9*8/(1*2*3)=120.
Приведём решение Юрия Красильникова на языке Python.
import ipaddress,math
s = bin(int(ipaddress.ip_address('130.0.5.80')))[2:].zfill(32) # Двоичное представление адреса сети
num = s.count('1')//2 # Половина количества единиц в ip-адресе
for l in range(32):
if s[:l].count('1') == num: break # l - минимальная длина строки с половинным количеством единиц
print(math.comb(32-l,num)) # Число способов расставить num единиц в поле номера узла

