Задание №13 — Маски подсети
В терминологии сетей ТСР/IР маской сети называют двоичное число, которое показывает, какая часть IР-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IР-адресом 249.0.33.87 и маской сети 255.252.0.0.
Сколько в этой сети IР-адресов, для которых в двоичной записи IР-адреса суммарное количество единиц в правых двух байтах более чем вдвое превосходит суммарное количество единиц в левых двух байтах?
В ответе укажите только число.
Правильный ответ
731
Пояснение
Решение:
Маска 255.252.0.0 содержит 14 единиц: . Значит свободны два младших бита второго байта и оба правых байта целиком — всего 18 битов, то есть в сети адреса, а адрес сети равен 249.0.0.0.
Обозначим через количество единиц в левых двух байтах, через — в правых двух. Первый байт зафиксирован: , в нём 6 единиц. Второй байт имеет вид , то есть добавляет единиц, где ; значит . Правые два байта свободны полностью: в их 16 битах может быть от 0 до 16 единиц.
Нужно, чтобы . Разбираем случаи:
- (один вариант второго байта): , нужно , то есть адресов;
- (два варианта): , нужно , то есть адресов на каждый вариант, итого 34;
- : , нужно — невозможно, 0 адресов.
Всего . Тот же результат даёт прямой перебор всех адресов сети.
ip = [249, 0, 33, 87]
mask = [255, 252, 0, 0]
net = [ip[i] & mask[i] for i in range(4)]
count = 0
for host in range(2 ** 18):
b2 = net[1] | (host >> 16)
b3 = (host >> 8) & 255
b4 = host & 255
left = bin(net[0]).count('1') + bin(b2).count('1')
right = bin(b3).count('1') + bin(b4).count('1')
if right > 2 * left:
count += 1
print(count)Ответ: 731