Чи є спосіб використання напівбітів?


19

Як знає більшість людей тут, використовуючи 4 біти, ми можемо нарахувати від 0 до 15 (0123456789ABCDEF у шістнадцятковій кількості). Але якби ми рахували лише до 9, ми все-таки використовували б 4 біти, а цифри від А до F були б марними.

Однак на сторінці QR-коду у Вікіпедії зазначено, що для використання лише числових цифр від 0 до 9 використовується 3⅓ біт на символ, що є правильним з точки зору статистичної позиції. І все ж третина біта - це не фізичний об’єкт, і для надсилання числа від 0 до 9, на мою інформацію, використовується щонайменше 4 біти.

Чи є спосіб використовувати витрачені комбінації для ефективного надсилання символу з дробами бітів?

Добре, дозвольте навести приклад: дві цифри "27" повинні бути надіслані. З нормальними методами кодування, надіслані біти будуть 00100111. Потім ми могли б уявити систему, яка замінить цифру '2' цифрою 'E' або 'F', залежно від наступного біта; у цьому випадку наступний біт дорівнює 0, тому "2" замінюється на "E". Отриманий бітовий рядок буде тоді 1101 0 111. З іншого боку, якщо цифри "28" повинні бути надіслані, перший біт після "2" - це 1, тож замість нього замінюється цифра "F", виходить рядок 1111 1 000.

В обох випадках було досягнуто економність 1 біта, тому що один клювач був використаний для двох різних символів. Іншим словом, на кожен символ використовується три з половиною біти.


2
Для іншої точки зору упаковки значень у менший пробіл цифр, ознайомтеся з термінальними комп'ютерами ( en.wikipedia.org/wiki/Ternary_computer ) Якщо це досить добре для Knuth, це досить добре для мене!
RLH

3
Ще краще визнати, що ви можете обчислити (10 * first_digit) + second_digitта кодувати це в 7 біт, що представляє 0 ... 99, з кодами 100-127, залишеними для інших речей. А ще більше заощаджень - 3 цифри, стислі в 10 біт.
Гарячі лизання

Щоб надіслати всі 100 різних значень окремо, найкраще, що ви можете отримати, це упаковка в 7 біт. Якщо у вас більше цифр, упаковка буде ефективнішою. Якщо у вас менше 64 значень для надсилання, ви можете надіслати його, використовуючи лише 6 біт
phuclv

Відповіді:


22

Ви не можете надіслати півбіт, але ви можете ефективно упакувати два половини біта в один біт перед передачею або зберіганням.

Ви самі наводите приклад, так що ви ефективно відповіли на власне запитання ДА.

Можливо, дещо простішим способом є просте кодування значення двох десяткових цифр у 7 біт. (Сортування двійкових кодованих подвійних десятків).


1
Один приємний випадок використання для упаковки пар цифр у сім біт - це при передачі файлів ASCII, які складаються здебільшого числових даних. Будь-яке значення байтів нижче 128 являє собою один символ ASCII, тоді як 128-227 представляють дві цифри ASCII. Легко кодувати або декодувати, і не вимагає, щоб дані містили в основному цифри (або навіть будь-які цифри), але можуть стискати рядки цифр на 50% дуже легко.
supercat

Або той формат PDP11, який упакував 3 буквено-цифрові символи в 16 біт з одним бітком запасного ...
Брайан Драммонд

@BrianDrummond: Можна використовувати 16 біт для зберігання рівно трьох символів з набору 40 або до трьох з набору 39, але запасного біта не буде. Зазвичай "буквено-цифровий" означатиме набір щонайменше 36, але єдиним способом було б запасний біт, якби набір був обмежений 32.
supercat

Я подумав, що це 5 біт / char. Буквено-цифровий розділився на два набори коду, з одним символом, зарезервованим для "встановлення коду комутатора". Я помилявся: en.wikipedia.org/wiki/DEC_Radix-50 Досить химерно, проте бачив це лише однієї ночі, коли мені довелося розшифровувати звіт, хтось мені дав 8-дюймову дискету, в системі CP / M, лише з тьмяним спогад про золото Z80.
Брайан Драммонд

19

Ви можете використовувати кодування Huffman, так що числа мають різну довжину бітів. якщо ви знаєте цифру, яка відбуватиметься частіше за інших, це допоможе.

приклад (з рівним виникненням):

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


12

Можливо, те, що ви шукаєте, - це арифметичне кодування, яке може ефективно кодувати рядок символів, кожен з яких в принципі може зажадати дробової (не цілої) кількості біт. (хоча загальне повідомлення має бути цілою кількістю біт)

Цитуючи Вікіпедію :

Арифметичне кодування відрізняється від інших форм ентропійного кодування, таких як кодування Хаффмана, тим, що замість того, щоб розділяти вхід на символи компонентів і замінювати кожен кодом, арифметичне кодування кодує все повідомлення в одне число, дробу n де (0,0 ≤ n < 1,0).


10

Новий IEEE P754 для арифметики з плаваючою комою тепер визначає десяткові формати на додаток до двійкових. Одне з кодування пропонує згрупувати цифрові цифри по 3 на 10 біт.

кодування від 0 до 999 з використанням 10 біт = 1024 можливих кодів є досить ефективним, а десяткові цифри часто згруповані за трьома.

Десяткове ущільнення : http://en.wikipedia.org/wiki/Densely_packed_decimal


Навіть якщо десяткові цифри згруповані за трьома, правильна семантика з десятковою плаваючою комою може зажадати, що або (1) масштабування мантіси за допомогою не-кратного на три потужності десять тягне за собою множення або ділення всіх складових на 10 або 100; (2) деякі біти можуть використовуватися для верхньої або нижньої частини числа, залежно від (показник моди 3); (3) Якщо експонент зберігається базовою-1000, то нижню групу з трьох цифр іноді, можливо, доведеться округлити до найближчої 10 або найближчої 100, а не до найближчої одиниці.
supercat

Я особисто вважаю, що такі типи, як BigDecimalдля багатьох цілей, були б ефективнішими, якби кожне слово містило 9 десяткових цифр, а не 32 біт, але поведінка округлення не повинна впливати на групування цифр.
supercat

4

1: 1 відповідність двійкової (або шістнадцяткової) є лише одним символом, що кодує біти. Так що так, як ви показали, це можливо. Інше місце, яке використовується, є (але дещо по-іншому) - в кодуванні / декодуванні решітки в системах зв'язку, в яких бітові переходи тримаються далі, щоб полегшити декодування. І звичайно, кодування 8b / 10b та 64b / 66b і т. Д. Тощо - це аналогічна ідея, в якій менший простір символів кодується в дещо зайвому просторі, щоб отримати баланс постійного струму, розділення символів та керування кодами в піддіапазонах.


4

Представлення даних залежить від інтерпретації, яку ви або ваша програма надає.

Ми можемо надіслати "27" також як ASCII символи, наприклад, поступаючись 0x3237 = 0b0011001000110111.

xn(x)log2n(x)

x1,x2n(x1),n(x2)log2n(x1)+log2n(x2)log2(n(x1)n(x2))

2log2(10)=24=8log2(1010)=7

Це завжди залежить від програми, але зазвичай, коли ви 'приєднуєте' змінні, як ви пропонуєте, це буде коштувати більше обчислювальної потужності, якщо ви хочете виконувати операції над цими змінними. Операції додавання і віднімання змінних "з'єднаних" є складнішими, ніж зазвичай, і можуть зажадати більше місця в апаратному забезпеченні або викликати більш тривалі затримки.



2

Звичайний спосіб упаковки значень - це множення кожного значення на його діапазон, так що ви отримуєте одне велике число, яке ви можете ефективно представити в бітах. При розпакуванні ви ділите по діапазону, решта - цифра, а результат - решта упакованих цифр.

Якщо у вас є 5 значень в діапазоні від 0 до 2, ви можете представити це в 8 бітах (вам потрібно щонайменше 7,92 біта для представлення значень) замість 10 біт, використовуваних наївним способом використання 2 біт для кожного значення, виконуючи (((n 1 * 3 + n 2 ) * 3 + n 3 ) * 3 + n 4 ) * 3 + n 5


Чи існує назва цього способу кодування?
Кіган Джей

1

Теоретично, якщо ви готові витратити простір ланцюга та потужність на детектор високого опору, ви можете надіслати 3 стани цифровим проводом (1, 0 і високий Z). Відмова від відповідальності: це чудово працює в тренажері. Я не знаю, чи є в ланцюзі якісь проблеми, які роблять це непрактичним, скажімо, він не може переключитися так швидко, як звичайна пара воріт.

Мій звичайний термін для переходу сигналу від високого Z до сигналу (де сигнал, як правило, мелений у кремнію), є напіврозрядним сигналом.


1

Ви хочете надіслати одну десяткову цифру, для цього потрібно 3⅓ біт. Але вам доведеться використовувати 4 біти, тому що ви не можете надіслати третину біта.

Отже, щоб дізнатися, що насправді означає 3⅓ біт, вам потрібно дві (або три) цифри по 3⅓ біт кожен. Якщо ви хочете надіслати 2 (3) десяткових цифр від 0 до 9, кожна з яких потребує трохи менше 3⅓ біт, ви можете зробити це, використовуючи 7 (10) біт. Конструктивне доведення легко:

7 (10) біт дозволяють кодувати число від 0 до 128 (1023) - але вам знадобиться лише від 00 (000) до 99 (999), які є усіма можливими кодуваннями двох (трьох) десяткових цифр. QED


1

Я думаю, ви нерозумієте, що мається на увазі у зв’язаній статті wiki. Що мається в виду , що для рядка символів, яка повністю числова (без пробілів, ком або періодів), використовуючи ідеальну компресію, ви можете представляти кожен символ , використовуючи 3 +1 / 3 біта в середньому . Насправді, це трохи краще, ніж це, оскільки математика говорить, що ви можете отримати log 2 (10) = 3.3219 біт / символ у довгостроковій перспективі.

Аналогічно, для набору буквено-цифрових знаків плюс деяких символів (лише великі регістри та 9 символів) або 45 символів потрібно журнал 2 (45) = 5,4918 біт / символ, який округлюється до 5,5 у статті.

Зменшені біти / символи досягаються за допомогою стиснення або заздалегідь заданого кодування, або схеми стиснення, визначеної стандартом QR (я не впевнений, який використовується). Він представляє середню кількість бітів, які знадобиться символу для кодування, тому окремий символ буде закодований за допомогою більш-менш бітів. Також зрозумійте, що перелічені вище значення є ідеальними значеннями для нескінченних, випадкових рядків. Можна отримати коефіцієнти стиснення, які кращі чи гірші для спеціально створених рядків.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.