Задание 7
Объём графической и звуковой информации
Сколько места занимают изображения и звук, как меняется объём после сжатия и сколько времени идёт передача.
5 подтем · 54 задачи · базовый · ≈ 5 мин
Подтема 1 из 5
Биты и длина кода
Биты, байты и крупные единицы — и сколько битов нужно, чтобы закодировать N цветов.
Как устроена тема
В задании 7 считают, сколько места занимает изображение или звукозапись, — и что с этим объёмом будет дальше: сжатие, передача по каналу, запись на карту. Вот задача, которую мы будем решать всю тему:
«Камера делает снимки размером 1024 × 768 пикселей с палитрой из 3000 цветов. Снимки передаются пакетами по 50 штук по каналу связи со скоростью 2 000 000 бит/с. Сколько секунд передаётся один пакет? В ответе запиши целую часть числа».
Объём — это сколько элементов хранится и сколько битов занимает каждый; дальше объём сжимают или передают и округляют ответ так, как требует вопрос. Сначала разберём, что сказано в условии:
| В условии | Что это значит |
|---|---|
| 1024 × 768 пикселей | в снимке 1024 · 768 точек |
| палитра из 3000 цветов | каждая точка хранит код цвета — столько битов, чтобы хватило на 3000 |
| пакет из 50 снимков | объём одного снимка умножить на 50 |
| 2 000 000 бит/с | столько битов канал передаёт за секунду |
| целая часть числа | дробную часть ответа отбросить |
Тема состоит из пяти подтем — у каждой своя страница. Идём по ним по порядку:
- Биты и длина кода — ты сейчас здесь.
- Изображение — сколько места занимает снимок.
- Сжатие и заголовки — как меняется объём после сжатия.
- Звук — сколько места занимает звукозапись.
- Передача — время передачи и ответ задачи темы: 235.
Биты и байты
Один двоичный знак — один бит, восемь битов — байт, а дальше единицы растут в 1024 = 2¹⁰ раза. Запись 01001101 занимает 8 бит, и запись 00000000 — тоже: нули хранятся так же, как единицы.
| Единица | В байтах | В битах |
|---|---|---|
| 1 байт | 1 | 8 = 2³ |
| 1 Кбайт | 1024 = 2¹⁰ | 2¹³ |
| 1 Мбайт | 1024² = 2²⁰ | 2²³ |
| 1 Гбайт | 1024³ = 2³⁰ | 2³³ |
Из крупных единиц в мелкие умножают, из мелких в крупные — делят. Со степенями двойки это удобно: 2¹⁸ бит = 2¹⁸ / 2¹³ = 2⁵ = 32 Кбайт. Проверить перевод можно одной строкой Python, как на калькуляторе:
print(3 * 1024 * 8, 2 ** 18 // 2 ** 13)** — степень, а — целая часть частного: 3 Кбайт = 24 576 бит, 2¹⁸ бит = 32 Кбайт.
Длина кода
Код из i бит имеет 2ⁱ вариантов: каждый новый бит удваивает их число. Двумя битами записываются 4 кода: 00, 01, 10, 11; тремя — 8; восемью — 256.
Для N цветов нужна наименьшая длина i, при которой 2ⁱ ≥ N. В задаче темы цветов 3000: 2¹¹ = 2048 мало, 2¹² = 4096 хватает. Значит, код цвета — 12 бит, и часть кодов останется незанятой — это нормально.
Здесь округляют только вверх, даже если N ближе к меньшей степени: для 300 цветов нужно 9 бит, хотя 300 ближе к 256. Восьми битов хватает лишь на 256 кодов.
Длина кода программой
С 2025 года число цветов в задачах — не степень двойки и доходит до десятков миллионов. Соседние степени удобно найти программой.
Функция bits увеличивает i, пока 2ⁱ меньше N; первое i, при котором кодов хватает, она и возвращает. Запусти её по шагам для 300 цветов:
def bits(n): i = 0 while 2 ** i < n: i += 1 return i print(bits(300))Функция пригодится до конца темы: её вызывают, где нужна длина кода.
print(bits(5), bits(300), bits(3000), bits(20000000))Нужная и выделенная длина
Если условие само говорит, сколько битов выделено на цвет, берут это число. «Используется 20 цветов, на код каждого цвета выделено 8 бит» — объём считают с 8 битами, хотя хватило бы пяти. Наименьшую длину ищут, только когда условие её требует: «минимально возможное количество бит», «одинаковое минимальное число бит».
Итого
- Байт8 бит
- Кбайт1024 байт = 2¹³ бит
- Мбайт1024 Кбайт = 2²³ бит
- Длина коданаименьшее i, при котором 2ⁱ ≥ N; 3000 цветов → 12 бит
- Выделено в условииберут заданное число битов
Проверьте себя
Ответь сначала сам, потом открой ответ.
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
ОтветСкрыть ответ
Практика
Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.
Биты в 2,5 Мбайт
Сколько битов содержится в 2,5 Мбайт?
Введите число.
Подсказка
Мбайт → Кбайт → байты → биты.
Решение
В Мбайте 1024 Кбайт, в Кбайте 1024 байта, в байте 8 бит: 2,5 · 1024 · 1024 · 8 = 20 971 520 бит.
Решение программой
print(int(2.5 * 1024 ** 2 * 8))Ответ: 20971520
Биты в 3 Кбайт
Сколько битов в 3 Кбайт?
Введите число.
Подсказка
Из крупных единиц в мелкие умножают: Кбайт → байты → биты.
Решение
В Кбайте 1024 байта, в байте 8 бит: 3 · 1024 · 8 = 24 576 бит.
Решение программой
print(3 * 1024 * 8)Ответ: 24576
2²⁰ бит в Кбайтах
Сколько Кбайт составляют 2²⁰ бит? Реши через степени двойки.
Введите число.
Подсказка
В одном Кбайте 2¹³ бит.
Решение
В одном Кбайте 1024 · 8 = 2¹³ бит, поэтому 2²⁰ бит = 2²⁰ / 2¹³ = 2⁷ = 128 Кбайт.
Решение программой
print(2 ** 20 // 2 ** 13)Ответ: 128
Код для 600 цветов
Нужно закодировать 600 цветов кодами одинаковой длины. Сколько битов нужно на код одного цвета?
Введите число.
Подсказка
Наименьшее i, при котором 2ⁱ не меньше числа цветов.
Решение
Девяти битов хватает только на 2⁹ = 512 кодов — меньше 600. Десять битов дают 2¹⁰ = 1024 кода, этого достаточно.
Решение программой
i = 1while 2 ** i < 600: i += 1print(i)Ответ: 10
Код для 4097 цветов
Какая наименьшая длина кода нужна, чтобы закодировать 4097 цветов кодами одинаковой длины?
Введите число.
Подсказка
Двенадцать битов дают 2¹² = 4096 кодов.
Решение
Двенадцать битов дают 2¹² = 4096 кодов — на один меньше, чем нужно. Тринадцать битов дают 8192 кода, этого хватает.
Решение программой
i = 1while 2 ** i < 4097: i += 1print(i)Ответ: 13
100 000 цветов
Для кодирования используется 100 000 различных цветов, код каждого цвета имеет одинаковую минимально возможную длину. Сколько бит занимает код одного цвета?
Введите число.
Подсказка
2¹⁶ = 65 536 — это меньше 100 000.
Решение
Шестнадцать битов дают 2¹⁶ = 65 536 кодов, этого мало. Семнадцать битов дают 2¹⁷ = 131 072 кода — хватает на 100 000 цветов.
Решение программой
i = 1while 2 ** i < 100_000: i += 1print(i)Ответ: 17