📋 Условие
Разбор задания 13 ЕГЭ по информатике: Работа с IP-адресами и масками через Excel. Что нужно знать для решения.
🔍 Подробное решение
Разбор задания 13 ЕГЭ по информатике: Работа с IP-адресами и масками через Excel.
Дано: сеть 122.159.136.144/255.255.255.248. Нужно посчитать, сколько IP-адресов в этой сети имеют число установленных битов (единиц) не кратное 4.
Пошаговая инструкция в Excel:
1. Ввод данных:
- A1: IP-адрес 122.159.136.144
- B1: маска сети 255.255.255.248
2. Разделение IP-адреса на байты:
Используем формулы ЛЕВСИМВ, ПСТР, ДЛСТР, ПОИСК
3. Перевод байтов в двоичный вид:
Функция ДЕС.В.ДВ
4. Подсчёт количества единичных битов:
ДЛСТР и ПОДСТАВИТЬ
5. Итоговое число единичных битов IP:
СУММ
6. Проверка условия делимости на 4:
ЕСЛИ и ОСТАТ
Дано: сеть 122.159.136.144/255.255.255.248. Нужно посчитать, сколько IP-адресов в этой сети имеют число установленных битов (единиц) не кратное 4.
Пошаговая инструкция в Excel:
1. Ввод данных:
- A1: IP-адрес 122.159.136.144
- B1: маска сети 255.255.255.248
2. Разделение IP-адреса на байты:
Используем формулы ЛЕВСИМВ, ПСТР, ДЛСТР, ПОИСК
3. Перевод байтов в двоичный вид:
Функция ДЕС.В.ДВ
4. Подсчёт количества единичных битов:
ДЛСТР и ПОДСТАВИТЬ
5. Итоговое число единичных битов IP:
СУММ
6. Проверка условия делимости на 4:
ЕСЛИ и ОСТАТ
📚 Теория
IP-адреса и маски подсетей. Адресация в IPv4.
🐍 Шаблон Python
Python
from ipaddress import *
# Создание сети
net = ip_network('1.2.3.4/255.255.255.192', 0)
net = ip_network('1.2.3.4/26', 0) # или с префиксом
print(net) # сеть / кол-во единиц
print(net[0]) # адрес сети
print(net[-1]) # широковещательный
print(net.netmask) # маска
print(net.num_addresses) # всего адресов
print(net.num_addresses - 2) # узлов
# Все IP сети:
for ip in net:
b = f'{int(ip):032b}' # в двоичном 🐍 Альтернативный способ
Способ 2
from ipaddress import *
# Тип 1: Определить адрес сети
net = ip_network('IP/Маска', 0)
print(net)
# Тип 2: Макс кол-во нулей в маске
maxi = 0
for mask in range(32 + 1):
net = ip_network(f'IP/{mask}', 0)
if str(net) == f'Адрес_сети/{mask}':
maxi = max(maxi, mask)
print(maxi)
# Тип 3: Кол-во IP с условием
net = ip_network('IP/Маска', 0)
cnt = 0
for ip in net:
b = f'{ip:b}'
# if условие: cnt += 1
# Тип 5: Два узла в одной сети
for mask in range(32 + 1):
net1 = ip_network(f'IP1/{mask}', 0)
net2 = ip_network(f'IP2/{mask}', 0)
if net1 == net2:
print(net1.netmask)