Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 184.74.140.0 и маской сети 255.255.252.0.
Сколько в этой сети IP-адресов, у которых количество единиц и количество нулей в двоичной записи IP-адреса одинаково?
В ответе укажите только число.
Правильный ответ
210
Пояснение
Решение:
В маске 255.255.252.0 ровно единицы, и 140 & 252 = 140, поэтому адрес сети — 184.74.140.0. Свободных битов , всего в сети адреса.
В IP-адресе 32 бита, поэтому условие «единиц столько же, сколько нулей» означает ровно 16 единиц. Неизменный префикс 1011100001001010100011 содержит 10 единиц, значит среди 10 свободных битов должно быть ещё единиц. Выбрать, какие именно 6 из 10 битов равны единице, можно способами.
ip = [184, 74, 140, 0]
mask = [255, 255, 252, 0]
def to_int(a):
return (a[0] << 24) | (a[1] << 16) | (a[2] << 8) | a[3]
n, m = to_int(ip), to_int(mask)
base = n & m # адрес сети
host = 32 - bin(m).count('1') # число свободных битов
cnt = 0
for i in range(2 ** host):
s = bin(base + i)[2:].zfill(32)
if s.count('1') == 16:
cnt += 1
print(cnt)Ответ: 210