Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 189.214.224.0 и маской сети 255.255.224.0.
Сколько в этой сети IP-адресов, у которых количество нулей в двоичной записи IP-адреса чётно?
В ответе укажите только число.
Правильный ответ
4096
Пояснение
Решение:
В маске 255.255.224.0 ровно единиц, и 224 & 224 = 224, так что адрес сети — 189.214.224.0. Под номер узла остаётся свободных битов, то есть в сети адресов.
Первые 19 битов у всех адресов сети одни и те же: 1011110111010110111, и в них 5 нулей — число нечётное. Поэтому общее количество нулей окажется чётным ровно тогда, когда среди 13 свободных битов нулей нечётное число. Но наборы длины 13 разбиваются на пары, отличающиеся последним битом, и в каждой паре чётность числа нулей разная, значит подходит ровно половина: .
ip = [189, 214, 224, 0]
mask = [255, 255, 224, 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('0') % 2 == 0:
cnt += 1
print(cnt)Ответ: 4096