Тип 13 № 78069 
Организация компьютерных сетей. Адресация. Подсчет количества адресов в сети
i
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате
применения поразрядной конъюнкции к заданному адресу узла и его маске.
Адрес сети и широковещательный адрес не могут быть использованы для адресации сетевых устройств.
Для узла с IP-адресом 14.253.13.6 адрес сети равен 14.253.0.0.
Каково максимально возможное количество единиц в двоичной записи IP-адреса этой сети, который может быть присвоен компьютеру?
В ответе укажите только число.
Решение.
Это задание ещё не решено, приводим решение прототипа.
В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате
применения поразрядной конъюнкции к заданному адресу узла и его маске.
Адрес сети и широковещательный адрес не могут быть использованы для адресации сетевых устройств.
Для узла с IP-адресом 145.46.8.250 адрес сети равен 145.46.0.0.
Каково максимально возможное количество единиц в двоичной записи IP-адреса этой сети, который может быть присвоен компьютеру? В ответе укажите только число.
Приведём аналитическое решение Юрия Красильникова.
Адрес сети в двоичном виде содержит семь единиц и выглядит так:
10010001001011100000000000000000
В конце адреса находится строка из 17 нулей. Очевидно, это максимальнао возможная длина номера узла.
Так как номер узла не может состоять только из единиц, то максимальное число единиц в нём - это 16.
Всего единиц 7+16=23.
Приведём решение на языке Python.
from ipaddress import *
otv = []
for mask in range(33):
net = ip_network(f'145.46.8.250/{mask}',False)
if '145.46.0.0' in str(net):
for ip in net:
if net.broadcast_address != ip:
otv.append(bin(int(ip)).count('1'))
print(max(otv))
Ответ: 23.
Приведём решение Юрия Красильникова на языке Python.
ipaddress import *
s = bin(int(ip_address('145.46.0.0')))[2:].zfill(32) # Двоичное представление адреса сети
netaddr1 = s.count('1') # Количество единиц в адресе сети
numcomp = s[::-1].index('1') # Количество нулей в конце адреса сети
# (т.е. максимально возможная длина номера узла)
print(netaddr1 + numcomp - 1) # -1, т.к. номер узла не может состоять из одних единиц
Приведём решение Сергея Донец на PascalABC.NET:
uses School;
function BitCount(n: longword): integer;
begin
Result := 0;
for var j := 0 to 31 do
if (n and (1 shl j)) <> 0
then Result := Result + 1;
end;
begin
for var i := 1 to 31 do
begin
var net := new CalcIP('145.46.8.250', i);
var networkStr := net.Network.ToString.Split(',')[0].Trim();
if networkStr = '145.46.0.0'
then begin
Writeln(BitCount(net.Hostmax.value10));
break;
end;
end;
end.
Ответ: 25