Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 160.140.43.140 и маской сети 255.255.255.252.
Сколько в этой сети IP-адресов, двоичная запись которых оканчивается на 0?
В ответе укажите только число.
Правильный ответ
2
Пояснение
Решение:
В маске 255.255.255.252 ровно единиц, и 140 & 252 = 140, поэтому адрес сети — 160.140.43.140, а свободных битов всего . В сети адреса: 160.140.43.140, .141, .142 и .143.
Двоичная запись оканчивается нулём в точности у чётных чисел, поэтому подходят адреса с последним байтом 140 и 142, а 141 и 143 — нет. Тот же вывод даёт общее рассуждение: последний бит свободен, значит ровно половина адресов сети чётна, то есть .
ip = [160, 140, 43, 140]
mask = [255, 255, 255, 252]
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.endswith('0'):
cnt += 1
print(cnt)Ответ: 2