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

В тер­ми­но­ло­гии сетей TCP/⁠IP мас­кой сети на­зы­ва­ют дво­ич­ное число, ко­то­рое по­ка­зы­ва­ет, какая часть IP-⁠ад­ре­са узла сети от­но­сит­ся к ад­ре­су сети, а какая  — к ад­ре­су узла в этой сети. Адрес сети по­лу­ча­ет­ся в ре­зуль­та­те при­ме­не­ния по­раз­ряд­ной конъ­юнк­ции к за­дан­но­му ад­ре­су узла и маске сети.

Сеть за­да­на IP-⁠ад­ре­сом 122.159.136.144 и мас­кой сети 255.255.255.248.

Сколь­ко в этой сети IP-⁠ад­ре­сов, для ко­то­рых ко­ли­че­ство еди­ниц в дво­ич­ной за­пи­си IP-⁠ад­ре­са не крат­но 4?

В от­ве­те ука­жи­те толь­ко число.

Спрятать решение

Ре­ше­ние.

1.  За­пи­шем числа маски сети и ад­ре­са сети в дво­ич­ной си­сте­ме счис­ле­ния:

25510  −  111111112,

24810  −  111110002,

12210  −  011110102,

15910  −  100111112,

13610  −  100010002,

14410  −  100100002.

2.  Адрес сети по­лу­ча­ет­ся в ре­зуль­та­те по­раз­ряд­ной конъ­юнк­ции чисел маски и чисел ад­ре­са узла (в дво­ич­ном коде). По­сколь­ку конъ­юнк­ция 0 с чем-либо все­гда равна 0, то на тех ме­стах, где числа маски равны 0, в ад­ре­се узла стоит 0. Ана­ло­гич­но, там, где числа маски равны 255, стоит само число, так как конъ­юнк­ция 1 с любым чис­лом равна этому числу.

3.  Адрес сети 122.159.136.144  . В дво­ич­ном пред­став­ле­нии ад­ре­са 13 еди­ниц в пер­вых трех бай­тах. Маска сети окан­чи­ва­ет­ся 3 ну­ля­ми. Сле­до­ва­тель­но, 8 ва­ри­ан­тов ад­ре­са. Также в чет­вер­том байте ад­ре­са есть еще две еди­ни­цы в пер­вом и чет­вер­том слева бите, всего еди­ниц 15. Для того чтобы ко­ли­че­ство еди­ниц в дво­ич­ной за­пи­си IP⁠-⁠⁠ад­ре­са было не крат­но 4, сумма еди­ниц долж­на не быть рав­ной 16. Для этого в по­след­них трех битах IP-⁠ад­ре­са ко­ли­че­ство еди­ниц долж­но быть не рав­ным 1. Таких зна­че­ний 5.

 

При­ведём ре­ше­ние Артёма Гри­ди­на на языке Python.

cnt = 0

for x in range(2**3):

if (15 + bin(x)[2:].count('1')) % 4 != 0:

cnt += 1

print(cnt)

 

Ответ: 5.

 

При­ведём ре­ше­ние на языке Python.

from ipaddress import ip_network

net = ip_network("122.159.136.144/255.255.255.248", strict=False)

bin_addresses = [f"{address:b}" for address in net]

counter = 0

for address in bin_addresses:

if address.count("1") % 4 != 0:

counter += 1

print(counter)

 

При­ведём ре­ше­ние Да­ни­ла Шар­ло­ва на языке Python.

from ipaddress import ip_network

net = ip_network('122.159.136.144/255.255.255.248',0)

print(sum(bin(int(ip)).count('1')%4!=0 for ip in net))

 

При­ведём ана­ли­ти­че­ское ре­ше­ние Юрия Кра­силь­ни­ко­ва.

Ip-адрес и маска из усло­вия вы­гля­дят так:

01111010100111111000100010010000

11111111111111111111111111111000

Так как адрес сети со­дер­жит 15 еди­ниц, то номер узла может со­дер­жать 0, 2 или 3 еди­ни­цы (чтобы общее число еди­ниц не было крат­но 4).

Обо­зна­чим C(n,k) число со­че­та­ний из n по k, Тогда ответ - C(3,0)+C(3,2)+C(3,3) = 1+3+1 = 5.

 

При­ведём ре­ше­ние Юрия Кра­силь­ни­ко­ва на языке Python.

import ipaddress,math

s = bin(int(ipaddress.ip_address('122.159.136.144')))[2:].zfill(32) # Дво­ич­ное пред­став­ле­ние ад­ре­са сети

m = bin(int(ipaddress.ip_address('255.255.255.248')))[2:].zfill(32) # Дво­ич­ное пред­став­ле­ние маски

das = m.count('1') # Длина ад­ре­са сети

k1 = s[:das].count('1') # ко­ли­че­ство еди­ниц в ад­ре­се сети

dnu = 32-das # Длина но­ме­ра узла

print(sum(math.comb(dnu,i) for i in range(dnu+1) if (k1+i)%4 != 0))


Аналоги к заданию № 68514: 69891 69922 70540 Все

Источник: ЕГЭ по ин­фор­ма­ти­ке 09.04.2024. До­сроч­ная волна