В терминологии сетей TCP/IP маской сети называют двоичное число, которое показывает, какая часть IP-адреса узла сети относится к адресу сети, а какая — к адресу узла в этой сети. Адрес сети получается в результате применения поразрядной конъюнкции к заданному адресу узла и маске сети.
Сеть задана IP-адресом 172.16.168.0 и маской сети 255.255.248.0.
Сколько в этой сети IP-адресов, для которых количество единиц в двоичной записи IP-адреса не кратно 5?
В ответе укажите только число
Выпишем адрес сети и маску в двоичной системе счисления:
172.16.168.010 = 1010 1100. 0001 0000. 1010 1000. 0000 00002,
255.255.248.010 = 1111 1111. 1111 1111. 1111 1000. 0000 00002.
Все IP-адреса в сети будут иметь вид:
1010 1100. 0001 0000. 1010 1xxx. xxxx xxxx2.
Посчитаем количество вариантов, для которых количество единиц в двоичной записи IP-адреса
Приведём программу на языке Python.
import itertools
count = 0
s = itertools.product([0,1],repeat = 11)
for i in s:
if (8 + sum(i))%5 !=0:
count += 1
print(count)
Приведём другое решение на языке Python.
from ipaddress import *
net = ip_network(f'172.16.168.0/255.255.248.0', 0)
cnt = 0
for ip in net:
s = f'{ip:b}'
if s.count('1') % 5 != 0:
cnt += 1
print(cnt)
Ответ: 1663.
Приведём решение Михаила Глинского на языке Python.
count = 0
for x in range(2**11):
s = bin(x)[2:]
if (8 + s.count('1'))%5 != 0:
count += 1
print(count)
Приведём решение Данила Шарлова на языке Python.
from ipaddress import ip_network
net = ip_network('172.16.168.0/255.255.248.0',0)
print(sum(bin(int(ip)).count('1')%5!=0 for ip in net))

