Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 123.19.251.232 и маской сети 255.255.255.248.
Сколько в этой сети IP-адресов, в двоичной записи которых содержатся три подряд идущие единицы?
В ответе укажите только число.
Правильный ответ
8
Пояснение
Решение:
Маска 255.255.255.248 в двоичном виде — 11111111.11111111.11111111.11111000, в ней 29 единиц. Значит, старшие 29 битов у всех адресов сети одинаковы, а на адрес узла остаётся 3 бита, то есть в сети адресов. Адрес сети: 232 & 248 = 11101000 & 11111000 = 11101000, поэтому это адреса от 123.19.251.232 до 123.19.251.239.
Выпишем неизменяемую часть в двоичном виде: 01111011.00010011.11111011.11101. Здесь важно не перебирать адреса вслепую, а заметить, что три подряд идущие единицы уже есть в самой фиксированной части — например, в третьем байте 251 = 11111011 подряд стоят целых пять единиц.
Раз нужный фрагмент содержится в битах, которые не меняются, условие выполняется для любого значения трёх узловых битов. Поэтому подходят все адреса сети, а их 8.
Проверка программой:
from itertools import product
def to_bits(s):
return ''.join(format(int(x), '08b') for x in s.split('.'))
ip = to_bits('123.19.251.232')
mask = to_bits('255.255.255.248')
k = mask.count('1')
head = ip[:k]
addrs = [head + ''.join(t) for t in product('01', repeat=32 - k)]
print(sum(1 for a in addrs if '111' in a))
Ответ: 8