Как известно большинству людей, используя 4 бита, мы можем считать от 0 до 15 (0123456789ABCDEF в шестнадцатеричном формате). Но если бы мы считали только до 9, мы все равно использовали бы 4 бита, и цифры от A до F были бы потрачены впустую.
Однако на странице QR-кода в Википедии говорится, что при использовании только цифровых цифр от 0 до 9 используется 3 9 бит на символ, что является правильным с точки зрения статистики. И все же треть бита не является физическим объектом, и отправка числа от 0 до 9 использует, по крайней мере, 4 бита, насколько мне известно.
Есть ли способ использовать потраченные впустую комбинации для эффективной отправки символа с долями битов?
Хорошо, позвольте мне привести пример: две цифры «27» должны быть отправлены. При нормальных методах кодирования отправленные биты были бы 00100111. Затем мы могли бы представить систему, которая заменит цифру «2» на цифру «E» или «F», в зависимости от следующего бита; в этом случае следующий бит равен 0, поэтому «2» заменяется на «E». Результирующая битовая строка будет тогда иметь вид 1101 0 111. С другой стороны, если цифры «28» должны быть отправлены, первый бит после «2» будет 1, поэтому вместо этого он заменяется цифрой «F», получая строку 1111 1 000.
В обоих случаях была достигнута экономия в 1 бит, потому что один клев использовался для двух разных символов. Другими словами, три с половиной бита используются для каждого символа.
(10 * first_digit) + second_digit
и закодировать это в 7 битов, представляющих 0 ... 99, с кодами 100-127, оставленными для других целей. И еще больше экономии благодаря 3 цифрам, сжатым в 10 бит.Ответы:
Вы не можете отправить половину бита, но вы можете эффективно упаковать две половины бита в один бит перед передачей или хранением.
Вы сами приводите пример, поэтому фактически ответили на свой вопрос ДА.
Возможно, несколько более простой способ заключается в простом кодировании значения двух десятичных цифр в 7 бит. (Вид двоичного кода с двойным десятичным знаком).
источник
Вы можете использовать кодирование Хаффмана, чтобы числа имели различную длину в битах. если вам известна цифра, которая встречается чаще других, это поможет.
пример (с одинаковым вхождением):
0 - 1111
1 - 1110
2 - 110
3 - 101
4 - 100
5 - 011
6 - 010
7 - 001
8 - 000
пример получения для получения номера 1:
Первый бит входит и оставляет только от 0 до 4 в качестве параметров.
второй бит входит и оставляет только от 0 до 2 в качестве параметров.
третий бит входит и оставляет от 0 до 1 в качестве параметров.
четвертый бит поступает, и входящий номер равен 1
источник
Возможно, то, что вы ищете, - это арифметическое кодирование, которое может эффективно кодировать строку символов, каждый из которых в принципе может потребовать дробного (нецелого) числа битов. (хотя общее сообщение должно быть целым числом битов)
Цитируя Википедию :
источник
Новый IEEE P754 для арифметики с плавающей запятой теперь определяет десятичные форматы в дополнение к двоичному. В одном из кодировок предлагается группировать цифровые цифры по 3 в 10 бит.
кодирование от 0 до 999 с использованием 10 битов = 1024 возможных кодов является достаточно эффективным, и десятичные цифры часто так или иначе группируются по трем.
Плотно упакованный десятичный знак : http://en.wikipedia.org/wiki/Densely_packed_decimal
источник
BigDecimal
бы для многих целей были бы более эффективными, если бы каждое слово содержало 9 десятичных цифр, а не 32 бита, но группирование цифр не должно влиять на поведение округления.Двоичное (или шестнадцатеричное) соответствие 1: 1 - это всего лишь один символ, кодирующий биты. Так что да, как вы показали, это возможно. Другое место, где это используется, - (но немного по-другому) - решетчатое кодирование / декодирование в системах связи, в которых переходы битов хранятся дальше друг от друга, чтобы облегчить декодирование. И, конечно, кодирование 8b / 10b и 64b / 66b и т. Д. И т. Д. Является аналогичной идеей, в которой меньшее пространство символов кодируется в немного избыточном большем пространстве для получения баланса постоянного тока, разделения символов и кодов управления в подполосах.
источник
Представление данных зависит от интерпретации, которую вы или ваша программа дает ему.
Мы могли бы отправить «27» также в виде символов ASCII, например, в качестве результата
0x3237 = 0b0011001000110111
.Это всегда зависит от приложения, но обычно, когда вы «объединяете» переменные, как вы предлагаете, это потребует больших вычислительных ресурсов, если вы захотите выполнить операции с этими переменными. Сложение и вычитание операций над «объединенными» переменными более сложны, чем обычно, и могут потребовать больше места в аппаратном обеспечении или вызвать более длительные задержки.
источник
Обычный способ упаковки значений заключается в умножении каждого значения на его диапазон, так что в итоге получается одно большое число, которое вы можете эффективно представить в битах. При распаковке вы делите на диапазон, остаток - это цифра, а результат - оставшиеся упакованные цифры.
Если у вас есть 5 значений в диапазоне от 0 до 2, вы можете представить это в 8 битах (для представления значений необходимо не менее 7,92 битов) вместо 10 битов, используемых наивным способом использования 2 битов для каждого значения, выполняя (((n 1 * 3 + n 2 ) * 3 + n 3 ) * 3 + n 4 ) * 3 + n 5
источник
Теоретически, если вы готовы тратить пространство схемы и мощность на детектор с высоким импедансом, вы можете отправить 3 состояния по цифровому проводу (1, 0 и высокий Z). Отказ от ответственности: это прекрасно работает в симуляторе. Я не знаю, есть ли у схемы какие-то проблемы, которые делают ее непрактичной, например, сказать, что она не может переключаться так же быстро, как обычная пара ворот.
Мой обычный термин для перехода сигнала от высокого Z к сигналу (где сигнал обычно заземлен в кремнии) - это полуразрядный сигнал.
источник
Вы хотите отправить одну десятичную цифру, требующую 3⅓ бит. Но вам придется использовать 4 бита, потому что вы не можете отправить треть бита.
Итак, чтобы узнать, что на самом деле означает 3⅓ бит, вам нужно две (или три) цифры по 3⅓ бита каждая. Если вы хотите отправить 2 (3) десятичные цифры от 0 до 9, каждая из которых требует чуть менее 3 less бит, вы можете сделать это, используя 7 (10) бит. Конструктивное доказательство легко:
7 (10) бит позволяют вам кодировать число от 0 до 128 (1023), но вам понадобятся только от 00 (000) до 99 (999), которые представляют собой все возможные кодировки из двух (трех) десятичных цифр. QED
источник
Я думаю, что вы неправильно понимаете, что подразумевается в связанной вики-статье. Что имеется в виду , что для строки символов, которая полностью числовая (без пробелов, запятых или периодов), используя идеальную компрессию, вы можете представлять каждый символ , используя 3 +1 / 3 бита в среднем . На самом деле, это немного лучше, чем это, поскольку математика говорит, что вы можете получить log 2 (10) = 3.3219 бит / символ в долгосрочной перспективе.
Аналогичным образом, для набора буквенно-цифровых символов плюс некоторые символы (только заглавные буквы и 9 символов) или 45 символов требуется лог 2 (45) = 5,4918 бит / символ, что в статье округлено до 5,5.
Уменьшенные биты / символ достигаются с помощью сжатия, либо с предварительно заданным кодированием, либо со схемой сжатия, определенной стандартом QR (я не уверен, какой из них используется). Он представляет собой среднее число битов, которое потребуется символу для кодирования, поэтому отдельный символ будет кодироваться с использованием большего или меньшего количества битов. Также осознайте, что значения, перечисленные выше, являются идеальными значениями для бесконечных случайных строк. Можно получить коэффициенты сжатия, которые лучше или хуже для специально созданных строк.
источник