Задание №13 — Маски подсети
В терминологии сетей ТСР/IР маской сети называют двоичное число, которое показывает, какая часть IР-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IР-адресом 252.67.33.87 и маской сети 255.252.0.0.
Сколько в этой сети IР-адресов, для которых в двоичной записи IР-адреса суммарное количество единиц в правых двух байтах более чем вдвое превосходит суммарное количество единиц в левых двух байтах?
В ответе укажите только число.
Правильный ответ
17
Пояснение
Решение:
Запишем адрес и маску в двоичном виде:
- IP: , ;
- маска 255.252.0.0 .
Адрес сети: , то есть 252.64.0.0. Свободных (изменяемых) разрядов 18: два младших бита второго байта и все 16 битов третьего и четвёртого байтов.
Обозначим — число единиц в левых двух байтах, — в правых двух. Первый байт даёт 6 единиц, зафиксированная часть второго байта () — ещё одну, а два свободных бита дают единиц, . Значит , а — число единиц среди 16 свободных битов, .
Условие задачи: .
- (один вариант, биты 00): нужно , таких значений ;
- : нужно — невозможно;
- : нужно — невозможно.
Итого 17 адресов. Проверка перебором:
ones = lambda x: bin(x).count('1')
count = 0
for b2 in range(64, 68): # 64 + два свободных бита
for x in range(0, 65536): # третий и четвёртый байты
L = ones(252) + ones(b2)
R = ones(x >> 8) + ones(x & 255)
if R > 2 * L:
count += 1
print(count) # 17
Ответ: 17