Задача:
При регистрации в компьютерной системе каждому пользователю выдаётся пароль, состоящий из 21 символов и содержащий только символы A, D, F, H, X, Y, Z (таким образом, используется 7 различных символов). Каждый такой пароль в компьютерной программе записывается минимально возможным и одинаковым целым количеством байт (при этом используют посимвольное кодирование и все символы кодируются одинаковым и минимально возможным количеством бит). Определите объём памяти в байтах, отводимый этой программой для записи 40 паролей.
Само решение:
Согласно условию, в номере могут быть использованы 7 букв. Известно, что с помощью N бит можно закодировать 2N различных вариантов. Поскольку 22 < 7 < 23, то для записи каждого из 7 символов необходимо 3 бита.
Для хранения всех 21 символов номера нужно 3 · 21 = 63 бита, а т. к. для записи используется целое число байт, то берём ближайшее не меньшее значение, кратное восьми, это число 64 = 8 · 8 бит (8 байт).
Тогда 40 паролей занимают 8 · 40 = 320 байт.
Ответ: 320
Теперь, у меня такой вопрос: почему мы проводим все это решение, если в условии сказано, что пароль состоит из 21 символа, а не из 7. Я попробовал все это дело на компе и правда, если записать в файл пароль из 7 символов по 40 раз, то получится 320!
Но как я и сказал, что пароль состоит из 21 символа, а не из 7, значит мы должны 21 умножить на 40 (учитывая, что каждый из символов весит по 1 байту) и того мы получаем 840 байт! Все это я тоже записал в файл 21 символ по 40 раз и результат был чуть больше 840 - приблизительно 879
Да, для записи пароля в текстовом виде в однобайтовой кодировке понадобится 21 байт. Это очевидно и без задачи.
Но в ее условии:
пароль в компьютерной программе записывается минимально возможным и одинаковым целым количеством байт
И вот в этой записи под каждый символ используется только три бита, так что в один байт можно запихнуть два символа с хвостиком, а в 8 байт влезает весь пароль из 21 символа. Просто записываются не сами символы, а их номер в списке - а таких номеров всего 7, а трех байт достаточно, чтобы закодировать числа от 0 до 7.
Вы, видимо, просто по неопытности все равно представляете себе память как байтовое поле, а решение оперирует с битами внутри байтов.
(учитывая, что каждый из символов весит по 1 байту)
Вот тут вы и ошибаетесь.
Именно для того, чтоб пароли занимали меньше места мы и закодировали каждый символ в 3 бита, а не использовали 1 байт - экономия 5 бит на символе.
Тогда на запись одного пароля надо 63 бита, или округляя - 8 байт на пароль, а не как вы считаете 21 байт, по байту на каждый символ, отсюда и финальные 320 байт на 40 паролей.
Так этот ответ (320) получится, если пароль будет состоять из семи символов, а в условии задачи сказано, что пароль состоит из ДВАДЦАТИ ОДНОГО СИМВОЛА!
GoodLuck890, содержащий только символы A, D, F, H, X, Y, Z (таким образом, используется 7 различных символов).
всего 7 разных символов в пароле может быть, т.е. на один символ пароля можно занять 3 бита вместо 8.
Замените символы на 0,1,2,3,4,5,6 - для каждой из этих цифр вы так-же будете по одному байту выделять?
Adamos выше правильно вам заметил - думайте на уровни битов а не байтов.
Чем больше знаю, тем лучше понимаю, как мало знаю.
В ответе всё правильно сказано, "Для хранения всех 21 символов номера нужно 3 · 21 = 63 бита". То есть 63 бита на один пароль длинной в 21 символ.
Но умножать надо бы 40 паролей на 63 бита, потому что именно такова длина одного пароля. А отвечающий округлил до 64 бит (такое условие задачи), получилось 8 байт.
Alexandroppolus, ну, писать пароли без выравнивания - явно неудачное решение. А если лишних байтов не тратится все равно, можно записать пароль способом, который меньше загружает процессор при зашифровке и расшифровке. А битовые операции заведомо "легче", чем умножение-деление на 7.
Slavik KENNY, это было бы возможно, если бы условие не требовало посимвольно кодировать буквы.
Тогда, поскольку алфавит всего из 7 букв, возможно 7 ^ 21 = 558545864083284007 различных паролей.
59-битное число дает 576460752303423488 различных значений, что немного больше.