Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 193.221.145.0 и маской сети 255.255.255.128.
Сколько в этой сети IP-адресов, у которых количество единиц и количество нулей в двоичной записи IP-адреса одинаково?
В ответе укажите только число.
Правильный ответ
35
Пояснение
Решение:
Маска 255.255.255.128 содержит 25 единиц и 7 нулей, поэтому первые 25 битов адреса закреплены за сетью и совпадают с адресом 193.221.145.0, а последние 7 битов свободны — всего в сети адресов.
В IP-адресе 32 бита, значит «единиц столько же, сколько нулей» означает ровно 16 единиц. Посчитаем единицы в неизменяемой части: 193 = 11000001 даёт 3 единицы, 221 = 11011101 даёт 6, 145 = 10010001 даёт 3, а старший (25-й) бит последнего байта равен нулю. Итого в фиксированной части единиц, поэтому среди 7 свободных битов должно быть ровно единицы. Число способов выбрать их равно .
def ip(a, b, c, d):
return ((a * 256 + b) * 256 + c) * 256 + d
base = ip(193, 221, 145, 0)
count = 0
for i in range(2 ** 7): # 7 свободных битов узла
s = format(base + i, '032b')
if s.count('1') == s.count('0'):
count += 1
print(count) # 35
Ответ: 35