Скільки біт на цифру в десятковій системі [закрито]


28

Я збираюсь навчити невелику групу людей щодо систем нумерації в обчисленні, і мені було цікаво, скільки біт на цифру є, наприклад, у десятковій системі:

  • Шестнадцятковий (основа 16) - 4 біти
  • Октал (основа 8) - 3 біти
  • Двійковий (основа 2) - 1 біт
  • Десяткові (основа 10) -?

7
Інтуїція: Скажімо, що ви шукаєте d, це охоплює одну десяткову цифру, діапазон 0..9. 3*dбіти означають три десяткових цифри і дозволяють представляти цілі числа з діапазону 0..999. Цілих десять біт (думаю, бінарні зараз) дають діапазон 0..1023. 999 досить близький до 1023, але трохи менше. Таким чином, ви можете очікувати, що це dмає бути менше 10/3.
Каміль Маціоровський

5
Ця публікація здається, що вона краще підійде для переповнення стека, ніж для Super User.
gmarmstrong

21
@gmarmstrong: Я б заперечував Mathematics.SE (або, можливо, SoftwareEngineering.SE). Це не пов'язано безпосередньо з проблемою програмування.
Flater

10
@Flater: Математика , безумовно, є правильним місцем, оскільки це в основному теорія інформації 101.
MechMK1

7
Не соромно не знати цього, але той, хто не може бути найкращою людиною для навчання систем числення.
WGroleau

Відповіді:


96

Що ви шукаєте, це 2-логарифм 10, що є ірраціональним числом близько 3,32192809489 ....

Те, що ви не можете використовувати ціле число біт для десяткової цифри, є першопричиною того, чому багато дробів, які легко виразити в десятковій системі (наприклад, 1/5 або 0,2), неможливо (не важко: дійсно неможливо) виразити у двійковій формі. Це важливо при оцінці помилок округлення в арифметиці з плаваючою комою.


Коментарі не для розширеного обговорення; ця розмова переміщена до чату .
DavidPostill

20

Іншими словами, яка кількість інформації міститься в одній цифрі в цих системах.

Для бази 2, бази 4, бази 8, бази 16 та інших 2 N підстав відповідь очевидна, оскільки в базі 2 N кожна цифра може бути виражена рівно N цифрами.

Як ви отримуєте N, заданий 2 N ? Що ж, ви використовуєте логарифм на основі 2, який є зворотною експоненцією.

  • log 2 2 = 1 (1 біт на цифру в базі 2)
  • log 2 4 = 2 (2 біти на цифру в базі 4)
  • log 2 8 = 3 (3 біти на цифру в базі 8)
  • log 2 16 = 4 (4 біти на цифру в базовій частині 16)

Логарифми чисел на основі K, що не є потужністю K, не є кардинальними числами. Зокрема:

  • журнал 2 10 = 3.321928094887362347870319429489390175864831393024580612054…

Це число може виглядати заплутано, але воно насправді має певне використання. Наприклад, це ентропія однієї десяткової цифри.

Для вашого випадку, однак, я не думаю, що це значення не приносить користі. @ Відповідь Крістіана добре допомагає пояснити, чому.


8

Щодо бітів:

Пробачте, можу сказати, що це питання неправильно. Ви не використовуєте біти таким чином. Трохи - це двійкова цифра . Ви можете перетворити десяткове число 10 у двійкове 1010 (8 + 2), тому вам знадобиться 4 біти, щоб виразити десяткове значення 10.


Повноваження 2

Ви потрапили в трохи пастки, використовуючи в якості прикладів двійкові (2), восьмеричні (8) та шістнадцяткові (16), тому що це всі сили 2, і таким чином ви можете думати про них з точки зору бітів, тоді як 10 не є силою 2, тому просто не дуже добре.


18
Питання не помилкове. У предметі теорії інформації цілком нормально говорити про біти таким чином. І тоді відповідь Євгена Ріка - хороша відповідь.

2
Я пропоную вам згадати BCD (двійковий кодований десятковий), який в електроніці зазвичай представлений 4-розрядними. На практиці кількість біт, що використовуються для представлення десяткового числа, зазвичай дорівнює 4, але це залежить від реалізації.
davidmneedham

1
@DavidStockinger Правильно, це залежить від того, теоретичне це питання чи питання про реалізацію.
davidmneedham

2
ln (10) / ln (2) - теоретична відповідь. 4 біта - вірогідна відповідь на реалізацію.
davidmneedham

2
@davidmneedham Ні, більшість номерів зберігаються у двійкових. BCD використовується для рідкісних спеціалізованих цілей, але більшість кодувань є цілими чи десятковими з плаваючою комою. У цих системах відповідь журналу є правильною, вона дає мінімальну кількість біт для зберігання всіх чисел заданої десяткової довжини (округлення) і пояснює, чому задана кількість бітів не зберігає фіксовану кількість десяткових цифр.
Джек Едлі

7

BCD - Бінарний кодований десятковий знак використовує 4 біти на цифру, те саме, що і шістнадцятковий.

https://en.wikipedia.org/wiki/Binary-coded_decimal


За винятком того, що "BCD" часто використовується для позначення 6-бітного кодування символів.
Даніель Р Хікс


@DanielRHicks Ага, гаразд. У Вікіпедії сказано, що він використовувався наприкінці 1950-х - початку 1960-х (тобто до винайдення EBCDIC), тому мені не соромно, що я ніколи про нього не чув. Хоча зараз я розумію, що назва EBCDIC походить від цього! У будь-якому випадку, термін BCD досі не "часто використовується" для позначення кодування, як ви говорите.
Містер Лістер

3

Використання бітів передбачає потужність 2, таким чином, як говорили інші, ви не можете легко підкорити 10 біт у байтах без марно. Поширене рішення - використовувати 4 біти на шістнадцятковий і витрачати 6 станів, представлених як AF. Цікавий біт - це робити десяткову математику - це не акуратно і просто.

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


Я вважаю, ви мали на увазі відповідь на Hex у своїй відповіді як на її Hex, який має значення AF
user92592

@ user92582 так, та. Виправлено.
davidgo

І ви можете використовувати ці "відходи" 6 станів для кодування десяткової крапки, негативу, термінатора послідовності тощо. Що стосується десяткової математики ... це не акуратно, але просто? Просто напишіть якийсь код, щоб робити те, чого ми навчаємо маленьких дітей: p
Kaithar

@kaithar - Я не вірю, що те, що ви пропонуєте, є дійсним, оскільки для будь-якої з цих операцій потрібен буде повний біт або більше - чого у вас немає.
davidgo

1
Немає ідеалу, де форму "10 біт" надходить. 10 біт = 1024 значення. Десяткова цифра має лише 10 можливих значень.
MSalters

3

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

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

Q1: Скільки бітів ви можете представити у десятковій цифрі ?

A1: Ви можете представити 3 біти інформації в одній десятковій цифрі:

Найпоширенішою схемою буде пряма двійкова з обгортанням, де 0 = 8 = 000 і 1 = 9 = 001. Але ви можете використовувати будь-яку схему, і нічого не говорить про те, що це єдиний спосіб кодування бітів у десяткових цифрах.

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- обгортання (або невикористане)
  • 9: 001 <- обгортання (або невикористане)

або

Q2: Скільки бітів потрібно, щоб представити десяткову цифру?

A2: Вам потрібно принаймні 4 біти, щоб представити всі десяткові цифри. З деякими відходами або загортанням.

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

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 0: 1010 <- обгортання (або невикористане)
  • 1: 1011 <- обгортання (або невикористане)
  • 2: 1100 <- обгортання (або невикористане)
  • 3: 1101 <- обгортання (або невикористане)
  • 4: 1110 <- обгортання (або невикористане)
  • 5: 1111 <- обгортання (або невикористане)

2

У базі 1024 кожен символ становить 10 біт. Три десяткових цифри мають стільки ж інформації, як одна цифра в базовій частині 1000, що трохи менше 1024. Тому десятковий розряд має трохи менше 10/3 біт. Це наближення дає 3.333333 ..., а точне число - 3.321928 ...


2
  • Шестнадцятковий (основа 16) - 4 біти
  • Октал (основа 8) - 3 біти
  • Двійковий (основа 2) - 1 біт
  • Десяткова (основа 10) - 3 1/3 біт.
    2 10 = 1,024
    10 3 = 1000
    2 20 = 1,048,576
    10 6 = 1 000 000
    3 цифри в базі 10 до 999 можуть міститися в 10 бітах в базі 2.
    6 цифр в базі 10 до 999,999 можна тримати в 20 бітах в базі 2.
    Це ідея виникнення кілобайт, мегабайт і гігабайт.

Це насправді трохи менше 3 1/3 ... Ваша відповідь трохи неоднозначна, і припущення про те, що цифри до 999 можна зберігати замість чисел між 0-1023, є дещо оманливим.
wizzwizz4

0

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

В середньому 3,2 біта представляють одну десяткову цифру - від 0 до 7 можуть бути представлені в 3 біти, тоді як 8 і 9 вимагають 4. (8*3 + 2*4)/10 == 3.21 .

Це менш корисно, ніж це звучить. З одного боку, у вас, очевидно, немає дрібних дробів. Для іншого, якщо ви використовуєте нативні цілі типи (тобто не BCD або BigInt), ви не зберігаєте значення як послідовність десяткових цифр (або їх двійкові еквіваленти). 8-бітний тип може зберігати деякі значення, що містять до 3-х десяткових цифр, але ви не можете представити всі тризначні цифри у 8 бітах - діапазон є [0..255]. Ви не можете представляти значення [256..999]лише у 8 біт.

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

Значення, виражені в десяткових знаках, не відображають чітко бінарні послідовності. Візьміть десяткове значення 255. Двійкові еквіваленти кожної цифри будуть 010, 101, 101. І все ж бінарне подання значення 255є 11111111. Просто немає відповідності жодної з десяткових цифр у значенні двійковій послідовності. Але існує пряма відповідність з шістнадцятковими цифрами - F == 1111так що це значення може бути представлене як FFу шістнадцятковій.

Якщо ви працюєте в системі, де 9-бітові байти і 36-бітні слова є нормою, то восьмерика має більше сенсу, оскільки біти групуються природним чином у трійки.


  1. Насправді середнє значення на одну цифру менше, оскільки для 0 і 1 потрібен лише один біт, тоді як для 2 і 3 потрібні лише 2 біти. Але на практиці ми вважаємо від 0 до 7 взяти 3 біти. Просто полегшує життя багатьма способами.


4
Це не так просто; наприклад, 3-або-4-бітове кодування недостатньо для того, щоб сказати, чи 1001001слід 91чи 49.

@Hurkyl: знову ж таки, моя точка зору використовує цілі типи фіксованої ширини - map 1001001to 73( 64 + 8 + 1). Я не трактую це як послідовність двійкових кодованих десяткових цифр. Якщо це повинен бути BCD, який повинен використовувати 4 біти на цифру, то ми повинні припустити провідний 0біт, так він повинен бути 49.
Джон Боде

2
Я просто намагався вказати, що кодування змінної довжини не такі прості, як ви робите їх; вам потрібно сказати, де закінчується один символ, а починається інший. тому ви не можете просто сказати, що ви можете представляти 8 і 9 чотирма бітами, 4-7 з трьома, 2-3 з двома і 0-1 з одним. І ви можете бачити, що 3.2цифра, яку ви отримуєте, фактично порушує зв'язану теорію інформації log(10)/log(2).

@Hurkyl: Я не намагався зробити щось просте, а також не говорив про якесь кодування. Найбільше значення, яке може бути представлене в 32-розрядному цілому, - це 10 десяткових цифр в ширину (3,2 біта на цифру), але немає відповідності між двійковим кодуванням будь-якої з цифр і двійковим кодуванням значення. Якщо ви використовуєте якусь форму двійкового кодування для десяткових цифр, то або ширину потрібно фіксувати a la BCD, або ви повинні використовувати якесь кодування Хаффмана, що я не прихильник.
Джон Боде

1
Проблема цієї схеми полягає в тому, що ви забули один додатковий біт, який вам потрібно вказати, чи відповідають 3 чи 4 біти. І при середній довжині 4,2 ​​біт на десяткову цифру це ще гірше, ніж BCD
MSalters

0

Якби я вчив цьому, я б спочатку пояснив, що означає число (виражене у вигляді серії цифр). тобто справа наліво, припускаючи основу n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.

Потім поясніть, що 10 ^ 3 приблизно дорівнює 2 ^ 10. Це не точно і є причиною в комп’ютерах, ми часто не знаємо, що дійсно означає 2k (це 2 000 або 2,048?), Він служить досить добре для швидких наближень. 2 ^ 16 - це приблизно 2 ^ (16 - 10) * 1000, або 2 ^ 6 (64) * 1000 або 64 000. Насправді це 65 536, але якщо ви не заперечуєте, щоб не було близько відсотка, це працює досить добре для швидких наближень.


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