Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 200.192.30.0 и маской сети 255.255.254.0.
Сколько в этой сети IP-адресов, у которых количество нулей в двоичной записи IP-адреса нечётно?
В ответе укажите только число.
Правильный ответ
256
Пояснение
Решение:
В маске 255.255.254.0 ровно единицы, и 30 & 254 = 30, поэтому адрес сети — 200.192.30.0. Свободных битов , а всего адресов .
Общая для всех адресов часть 11001000110000000001111 содержит 14 нулей — число чётное, и на чётность итога она не влияет. Значит суммарное количество нулей нечётно ровно тогда, когда нечётно количество нулей среди 9 свободных битов. Разобьём наборы на пары, отличающиеся последним битом: в каждой паре подходит ровно один набор, поэтому ответ — половина сети, .
ip = [200, 192, 30, 0]
mask = [255, 255, 254, 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 == 1:
cnt += 1
print(cnt)Ответ: 256