В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 122.159.136.144 и маской сети 255.255.255.248.
Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса
В ответе укажите только число.
1. Запишем числа маски сети и адреса сети в двоичной системе счисления:
25510 − 111111112,
24810 − 111110002,
12210 − 011110102,
15910 − 100111112,
13610 − 100010002,
14410 − 100100002.
2. Адрес сети получается в результате поразрядной конъюнкции чисел маски и чисел адреса узла (в двоичном коде). Поскольку конъюнкция
3. Адрес сети 122.159.136.144 . В двоичном представлении адреса
Приведём решение Артёма Гридина на языке 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))

