Задания
Версия для печати и копирования в MS Word
Тип 13 № 78038
i

В тер­ми­но­ло­гии сетей 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.


Аналоги к заданию № 78038: 78069 Все