В терминологии сетей TCP/IP маской сети называется двоичное число,определяющее, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу самого узла в этой сети. Обычно маска записывается по тем же правилам, что и IP-адрес, — в виде четырёх байтов, причём каждый байт записывается в виде десятичного числа. При этом в маске сначала (в старших разрядах) стоят единицы, а затем с некоторого разряда — нули. Адрес сети получается в результате применения поразрядной конъюнкции к заданному IP-адресу узла и маске.
Например, если IP-адрес узла равен 231.32.255.131, а маска равна 255.255.240.0, то адрес сети равен 231.32.240.0.
Для узла с IP-адресом 111.81.208.27 адрес сети равен 111.81.192.0. Чему равно наибольшее возможное значение третьего слева байта маски? Ответ запишите в виде десятичного числа.
Запишем третий байт IP-адреса и адреса сети в двоичной системе счисления:
20810 = 110100002,
19210 = 110000002.
Видим, что два первых слева бита маски — единицы, а третий бит может быть как нулем, так и единицей. Для того чтобы значение было наибольшим, этот бит должен быть равен единице. Получаем, что третий слева байт маски равен 111000002 = 22410.
Ответ: 224.
Приведём решение Ларисы Нефёдовой на языке Python.
from ipaddress import *
ip = ip_address('111.81.208.27')
net = ip_address('111.81.192.0')
for mask in range(33):
network = ip_network(f'{ip}/{mask}', 0)
if net == network.network_address:
mask = network.netmask
byte3 = str(mask).split('.')[2]
print(byte3)
Приведём решение Юрия Красильникова на языке Python.
mask = [int('1'*i+'0'*(8-i),2) for i in range(9)]
print(max([m for m in mask if 208&m==192]))
Приведём решение Сергея Донец на языке PascalABC.NET.
uses School;
begin
var ip := '111.81.208.27';
var net := '111.81.192.0';
for var mask := 31 downto 1 do begin
var calc := new CalcIP(ip, mask);
if calc.Network.value = net then
begin
var mask_str := calc.Netmask.value;
var octets := mask_str.Split('.');
var thirdOctet := octets[2].ToInteger;
Print(thirdOctet);
break; // ответ 224
end;
end;
end.

