Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 132.72.244.192 и маской сети 255.255.255.240.
Сколько в этой сети IP-адресов, в двоичной записи которых содержатся три подряд идущие единицы?
В ответе укажите только число.
Правильный ответ
16
Пояснение
Решение:
Сначала находим саму сеть: её адрес — поразрядная конъюнкция адреса узла и маски. В маске 255.255.255.240 ровно единиц, и 192 & 240 = 192, поэтому адрес сети — 132.72.244.192. Свободных битов , значит в сети адресов: от 132.72.244.192 до 132.72.244.207.
Теперь смотрим на неизменную часть двоичной записи — первые 28 битов одинаковы у всех адресов сети. Третий байт 244 = 11110100 целиком лежит в этом префиксе и уже содержит четыре единицы подряд. Значит цепочка из трёх единиц найдётся в записи каждого адреса, и условию удовлетворяют все 16 адресов сети.
ip = [132, 72, 244, 192]
mask = [255, 255, 255, 240]
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 '111' in s:
cnt += 1
print(cnt)Ответ: 16