Тип 13 № 60255 
Организация компьютерных сетей. Адресация. Подсчет количества адресов в сети
i
В терминологии TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети. Сеть задана IP-адресом 192.168.32.160 и маской сети 255.255.255.240. Сколько в этой сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна?
В ответе укажите только число.
Решение. 1. Запишем числа маски сети и адреса сети в двоичной системе счисления:
25510 − 111111112,
24010 − 111100002,
19210 − 110000002,
16810 − 101010002,
3210 − 001000002,
16010 − 101000002.
2. Адрес сети получается в результате поразрядной конъюнкции чисел маски и чисел адреса узла (в двоичном коде). Поскольку конъюнкция 0 с чем-либо всегда равна 0, то на тех местах, где числа маски равны 0, в адресе узла стоит 0. Аналогично, там, где числа маски равны 255, стоит само число, так как конъюнкция 1 с любым числом равна этому числу.
3. Адрес сети 192.168.32.160 . В двоичном представлении адреса 8 единиц, сумма единиц чётна. Маска сети оканчивается 4 нулями. Следовательно, 16 вариантов адреса, из которых половина чётная. В сети IP-адресов, для которых сумма единиц в двоичной записи IP-адреса чётна ровно 8.
Ответ: 8.
Приведём решение Владимира Артамонова на языке Python.
from ipaddress import ip_network # Стандартная библиотека
net = ip_network("192.168.32.160/255.255.255.240", strict=False) # Создаем объект сети "ip/маска"
bin_addresses = [f"{address:b}" for address in net] # Все адреса сети переводим в двоичный вид
counter = 0
for address in bin_addresses:
if address.count("1") % 2 == 0: # Считаем сколько адресов подходят под условие
counter += 1
print(counter)
Приведём решение Данила Шарлова на языке Python.
from ipaddress import ip_network
net = ip_network('192.168.32.160/28', 0)
count = sum(bin(int(ip)).count('1') % 2 == 0 for ip in net)
print(count)
Приведём решение Сергея Донец на языке PascalABC.NET.
uses School;
begin
var net:=new CalcIP('192.168.32.160','255.255.255.240');
net.GenAddrBin.Count(t->t.CountOf('1').IsEven).Print;//8
end.
Ответ: 8