К содержанию

Подтема 5 из 6

Составной код

Код из частей со своими алфавитами и номер, записанный двоичным числом: где выделяют целые байты.

Части кода

Идентификатор — 4 заглавные латинские буквы и 3 цифры. Сколько байт он занимает, если у каждой части свой код символа?

У каждой части свой алфавит и своё число битов на символ; биты частей складывают. Буквы: 26 → 5 бит, 4 · 5 = 20 бит. Цифры: 10 → 4 бита, 3 · 4 = 12 бит. Вместе 32 бита = 4 байта.

Один идентификатор тремя способами: части подряд — 4 байта, каждой части свои байты — 5 байт, общий алфавит из 36 символов — 6 байт.

Если же «все символы кодируются одинаковым числом бит», алфавит общий: 26 + 10 = 36, по 6 бит, 7 · 6 = 42 бита → 6 байт. Решает формулировка условия.

Номер числом

К паролю задачи темы добавили номер отдела от 1 до 500, записанный двоичным числом минимальной длины. Сколько бит занимает номер?

Число от 1 до m в двоичной записи занимает j бит, где 2ʲ > m: j битов записывают числа только до 2ʲ − 1. 2⁸ = 256 ≤ 500 < 512 = 2⁹, номеру нужно 9 бит.

Это не то же, что код варианта. 128 разным объектам хватит 7 бит — коды от 0000000 до 1111111. А само число 128 = 10000000 — восемь цифр.

Три бита: восьми объектам хватает кодов от 000 до 111, а число 8 = 1000 записывается уже четырьмя битами.
Вручную

«Номер записан как двоичное число» — ищи степень двойки, строго бо́льшую наибольшего номера. «Тип — одно из N значений, кодируется минимальным числом бит» — это N вариантов, как алфавит: 2ʲ ≥ N. Ответы различаются, только когда m — степень двойки.

Python

Метод — число цифр двоичной записи числа. Скобки вокруг числа нужны, чтобы точку не приняли за дробную часть:

print((500).bit_length(), (128).bit_length(), bits(128))
9 8 7

Где выделяют байты

Пароль (90 бит) и номер отдела (9 бит) хранят вместе. Сколько байт они занимают?

Ответ зависит от того, чему условие выделяет целые байты: всему коду — сложи биты и округли; каждой части — округли каждую. Подряд: 90 + 9 = 99 бит → 13 байт. Отдельно: 12 + 2 = 14 байт.

Пароль и номер подряд занимают 13 байт. Когда у номера свои байты, ему нужно два байта, и всего выходит 14.
Вручную

Если в той же базе 40 записей заняли 1200 байт, запись — 30 байт, и сведениям остаётся 30 − 13 = 17 байт, когда пароль и номер записаны подряд, или 30 − 14 = 16 байт, когда у каждого свои байты.

Python
from math import ceilpassword = 15 * bits(62)number = (500).bit_length()together = ceil((password + number) / 8)apart = ceil(password / 8) + ceil(number / 8)print(together, apart, 30 - together, 30 - apart)
13 14 17 16
Тонкости:объект из блоков

Объект описывают блоками: блок — тип (одно из 9 значений, 4 бита) и три буквы (3 · 5 = 15 бит), всего 19 бит. Десять блоков подряд — 190 бит → 24 байта; если целые байты у каждого блока — 10 · 3 = 30 байт. Считают снизу вверх: элемент, блок, объект, все объекты. Если место резервируют под наибольшее число блоков, считают по нему.

Итого

  • Частиу каждой свой алфавит, биты складывают
  • Общий код«все символы одинаково» — один алфавит
  • Номер числом2ʲ > m, m.bit_length()
  • Варианты2ʲ ≥ N, как у алфавита
  • Байты всемусложить биты, потом округлить
  • Байты частямокруглить каждую часть

Проверьте себя

Ответь сначала сам, потом открой ответ.

Вопрос 1
Сколько битов нужно номеру от 1 до 1117, записанному двоичным числом?
ОтветСкрыть ответ
Ответ
11: 2¹⁰ = 1024 ≤ 1117 < 2048.
Вопрос 2
Сколько битов нужно номеру от 1 до 256, записанному двоичным числом?
ОтветСкрыть ответ
Ответ
9: 256 = 100000000₂ — девять цифр.
Вопрос 3
Сколько битов нужно, чтобы дать разные коды одинаковой длины 256 объектам?
ОтветСкрыть ответ
Ответ
8: 2⁸ = 256 кодов, от 00000000 до 11111111.
Вопрос 4
Код — 5 заглавных латинских букв и 3 цифры, у каждой части свои биты на символ, целые байты — всему коду. Сколько байт?
ОтветСкрыть ответ
Ответ
5: 5 · 5 + 3 · 4 = 37 бит, вверх до 5 байт.
Вопрос 5
Тот же код, но каждой части свои целые байты. Сколько байт?
ОтветСкрыть ответ
Ответ
6: 25 бит — 4 байта, 12 бит — 2 байта.

Практика

Для проверки ответов нужен JavaScript. Условия, подсказки и решения доступны ниже.

Байты всему коду

Код состоит из пяти заглавных латинских букв и трёх десятичных цифр. У каждой части своё минимальное число битов на символ, целые байты выделяются всему коду. Сколько байтов займёт код?

Введите число.

Общий код для букв и цифр

Код состоит из 6 заглавных латинских букв и 4 цифр от 1 до 9 (ноль не используется). Все 10 символов кодируются одним общим кодом одинаковой минимальной длины, код занимает минимальное целое число байтов. Сколько байтов займёт код?

Введите число.

Номер 256 двоичным числом

Сколько битов нужно, чтобы записать двоичным числом номер от 1 до 256?

Введите число.

Срок действия на пропуске

На пропуске записаны личный код из 10 заглавных латинских букв (минимальное целое число байтов) и срок действия: номер года от 0 до 63 и номер дня от 1 до 366, оба двоичными числами минимальной длины, а вместе — минимальное целое число байтов. Сколько байтов занимает вся информация на пропуске?

Введите число.

Дополнительные данные объекта

Код объекта состоит из двух частей: категория — 8 заглавных латинских букв, номер внутри категории — целое число от 1 до 5000, записанное как двоичное число минимальной длины. Буквы кодируются посимвольно минимальным числом битов, код в целом занимает минимальное целое число байтов. Кроме кода, для каждого объекта выделено одинаковое целое число байтов дополнительных данных. Для 64 объектов потребовалось 2368 байтов. Сколько байтов дополнительных данных приходится на объект?

Введите число.

Номер в своих байтах

Личный код сотрудника — 13 символов, каждый из которых одна из 12 разрешённых букв или одна из 10 цифр; код кодируется посимвольно одинаковым минимальным числом битов и занимает минимальное целое число байтов. Номер подразделения — целое число от 1 до 100, записан двоичным числом и занимает минимальное целое число байтов. Всего на пропуске 32 байта данных. Сколько байтов выделено дополнительным сведениям?

Введите число.

Номер вместе с кодом

То же, что в задаче 4, но личный код и номер подразделения записаны подряд и вместе занимают минимальное целое число байтов. Сколько байтов выделено дополнительным сведениям?

Введите число.

Описания 4096 объектов

Объект описывается 30 блоками (место отведено под 30 блоков у каждого объекта). Блок — код из 5 символов, каждый из которых заглавная латинская буква или цифра, и тип — одно из чисел от 1 до 1000, кодируется минимальным числом битов; блок в целом занимает минимальное целое число байтов. Сколько Кбайт займут описания 4096 объектов?

Введите число.

Дополнительная информация объекта

Описание объекта включает идентификатор из 6 заглавных латинских букв (каждая кодируется минимальным числом битов, идентификатору — минимальное целое число байтов), структуру и дополнительную информацию. Структура — последовательность простых элементов, всего 3000 видов; каждый элемент кодируется одинаковым минимальным числом битов, под структуру выделено минимальное целое число байтов, достаточное для 40 элементов. Для дополнительной информации выделено одинаковое целое число байтов. Данные о 16 384 объектах заняли 2 Мбайт. Сколько байтов дополнительной информации приходится на объект?

Введите число.