Задание №13 — Маски подсети
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая – к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 250.191.91.128 и маской сети 255.255.255.128.
Сколько в этой сети IP-адресов, у которых количество нулей в двоичной записи IP-адреса кратно трём?
В ответе укажите только число.
Правильный ответ
43
Пояснение
Решение:
В маске 255.255.255.128 ровно единиц, и 128 & 128 = 128, поэтому адрес сети — 250.191.91.128. Свободных битов , всего в сети адресов.
Неизменный префикс 1111101010111111010110111 содержит 6 нулей, а 6 делится на 3. Значит общее число нулей кратно трём тогда и только тогда, когда кратно трём количество нулей среди 7 свободных битов, то есть оно равно 0, 3 или 6. Остаётся выбрать позиции этих нулей: .
ip = [250, 191, 91, 128]
mask = [255, 255, 255, 128]
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 s.count('0') % 3 == 0:
cnt += 1
print(cnt)Ответ: 43