В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 106.184.0.0 и маской сети 255.248.0.0.
Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса не кратна 2?
В ответе укажите только число.
Рассмотрим какая часть IP-адреса относиться к адресу сети. Первый байт слева у маски 255, следовательно, он относятся к адресу сети.
Рассмотрим второй слева байт маски в двоичной системе счисления:
24810 = 1111 10002.
Видим, что первые 5 бит маски относятся к адресу сети, следовательно, оставшаяся часть относится к адресам узлов. Следовательно, для адресов узлов выделено 3 бита из второго слева байта и 8+8 из третьего и четвертого слева байт. Всего 19 бит.
Всего возможно 219= 524288 IP-адресов, в половине из которых сумма единиц будет кратно 2. Следовательно, в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса не кратна 2:
Ответ: 262 144.
Примечание.
В маске после нуля идут только одни нули.
Приведём решение на языке Python.
from ipaddress import ip_network
cnt = 0
for ip in ip_network('106.184.0.0/255.248.0.0'):
new_ip = bin(int(ip))[2:].zfill(32)
if new_ip.count('1') % 2 != 0:
cnt += 1
print(cnt)
Приведём решение Ильи Андрианова на языке Python.
from ipaddress import *
net = ip_network('106.184.0.0/255.248.0.0', 0)
cnt = 0
for ip in net:
s = f'{ip:b}'
if s.count('1') % 2 != 0:
cnt += 1
print(cnt)

