Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 149.82.100.0 и маской сети 255.255.254.0.
Сколько в этой сети IP-адресов, у которых количество единиц и количество нулей в двоичной записи IP-адреса одинаково?
В ответе укажите только число.
Правильный ответ
84
Пояснение
Решение:
В маске 255.255.254.0 ровно 23 единицы, значит старшие 23 бита адреса закреплены за сетью и одинаковы у всех её узлов, а младшие 9 битов свободны — всего в сети адресов. Запишем адрес сети в двоичном виде: 10010101 01010010 01100100 00000000; фиксированная часть — это первые 23 бита 10010101010100100110010, в них 10 единиц.
Условие «единиц и нулей поровну» для 32-битного адреса означает ровно 16 единиц. Следовательно, в 9 свободных битах должно стоять единиц, а расставить 6 единиц по 9 позициям можно способами. Тот же ответ даёт прямой перебор всех 512 адресов сети.
net = 149 * 256**3 + 82 * 256**2 + 100 * 256
host = 32 - 23 # число свободных битов
count = 0
for k in range(2 ** host):
a = net + k
bits = bin(a)[2:].zfill(32)
if bits.count('1') == bits.count('0'):
count += 1
print(count) # 84
Ответ: 84