Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 212.84.49.48 и маской сети 255.255.255.248.
Сколько в этой сети IP-адресов, у которых количество нулей в двоичной записи IP-адреса чётно?
В ответе укажите только число.
Правильный ответ
4
Пояснение
Решение:
В маске 255.255.255.248 = 11111111.11111111.11111111.11111000 двадцать девять единиц, поэтому первые 29 битов адреса фиксированы, а последние 3 свободны: в сети адресов. Адрес сети: 48 & 248 = 00110000 & 11111000 = 00110000, то есть это адреса от 212.84.49.48 до 212.84.49.55.
Общее число нулей в адресе складывается из нулей неизменяемой части и нулей узловой части, поэтому достаточно посмотреть на чётности. Фиксированные биты — 11010100.01010100.00110001.00110: в 212 четыре нуля, в 84 — пять, в 49 — пять, в пяти старших битах последнего байта 00110 — три, всего , то есть нечётное число.
Значит, общее количество нулей будет чётным ровно тогда, когда в трёх узловых битах нулей нечётное число — один или три. Наборов с одним нулём (это 011, 101, 110), с тремя нулями — (набор 000), итого адреса: 212.84.49.48, 212.84.49.51, 212.84.49.53 и 212.84.49.54.
Проверка программой:
from itertools import product
def to_bits(s):
return ''.join(format(int(x), '08b') for x in s.split('.'))
ip = to_bits('212.84.49.48')
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 a.count('0') % 2 == 0))
Ответ: 4