Задача № 96. Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна?
В терминологии сетей ТСР/Р маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной коньюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 192.168.32.160
и маской сети 255.255.255.240
.
Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна?
В ответе укажите только число.
Решение
В этой задаче адрес сети неважен. Чтобы решить, определим, сколько адресов допускает маска. Для этого посчитаем количество нулей в маске.
\( 240_{10} = 1111 \)\(0000\)\(_2\)
В маске четыре нуля. Она допускает \( 2^4=16 \) адресов. Ровно половина адресов будет с чётной суммой единиц.
Решим задачу с помощью Python
Переберём все адреса и посчитаем, сколько из них содержат чётное количество единиц.
# подключим библиотеку для работы с ip-адресами
from ipaddress import IPv4Network
# определим сеть, используя адрес сети и маску
network = IPv4Network("192.168.32.160/255.255.255.240")
# в переменную count сохраним количество адресов с чётной суммой единиц
count = 0
# посмотрим на каждый адрес в сети
for addr in network:
# f"{addr:b}" — преобразует адрес в двоичное число
if f"{addr:b}".count('1') % 2 == 0:
# посчитаем адрес, если количество единиц чётное
count += 1
# выводим ответ
print(count)
Всё то же самое, но коротко.
from ipaddress import IPv4Network
network = IPv4Network("192.168.32.160/255.255.255.240")
print(sum(f"{addr:b}".count('1') % 2 == 0 for addr in network))