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

29

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

  • Шестнадцатеричный (основа 16) - 4 бита
  • Восьмеричное (основание 8) - 3 бита
  • Бинарный (база 2) - 1 бит
  • Десятичное число (основание 10) -?
user92592
источник
7
Интуиция: скажем, что вы ищете d, это охватывает одну десятичную цифру, диапазон 0..9. 3*dбиты означают три десятичных знака и позволяют вам представлять целые числа из диапазона 0..999. Целые десять бит (подумайте двоично) дают диапазон 0..1023. 999 довольно близко к 1023, но немного меньше. Таким образом, вы можете ожидать, dдолжно быть немного меньше, чем 10/3.
Камиль Мачоровский
5
Похоже, что этот пост лучше подходит для переполнения стека, чем для суперпользователя.
gmarmstrong
21
@gmarmstrong: Я бы поспорил с Mathematics.SE (или, возможно, SoftwareEngineering.SE). Это не имеет прямого отношения к проблеме программирования.
Флейтер
10
@Flater: Математика определенно правильное место, так как это в основном информационная теория 101.
MechMK1
7
Нет ничего постыдного в том, что я этого не знаю, но тот, кто не может быть лучшим человеком для обучения систем счисления.
WGroleau

Ответы:

97

То, что вы ищете, это логарифм на основе 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, не являются кардинальными числами. Особенно:

  • log 2 10 = 3.321928094887362347870319429489390175864831393024580612054…

Это число может показаться запутанным, но на самом деле оно имеет некоторое применение. Например, это энтропия одной десятичной цифры.

Для вашего случая, однако, я не думаю, что это значение имеет какое-либо значение. Ответ @ Кристиана хорошо объясняет почему.

gronostaj
источник
8

На предмет битов:

Мне жаль говорить, что вопрос неверный. Вы не будете использовать биты таким образом. Бит - это двоичная цифра . Вы можете преобразовать десятичное число 10 в двоичное число 1010 (8 + 2), поэтому вам потребуется 4 бита для выражения десятичного значения 10.


Полномочия 2

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

Кристиан
источник
18
Вопрос не ошибочный. В области теории информации совершенно нормально говорить о битах таким образом. И тогда ответ Евгения Рика - хороший ответ.
2
Я предлагаю упомянуть BCD (двоично-десятичный десятичный код), который обычно представлен 4-разрядными в электронике. На практике количество битов, используемых для представления десятичного числа, обычно составляет 4, но это зависит от реализации.
davidmneedham
1
@DavidStockinger Правильно, это зависит от того, является ли это теоретическим вопросом или вопросом реализации.
Давидмнидхам
2
ln (10) / ln (2) - теоретический ответ. 4 бита - вероятный ответ реализации.
Давидмнидхам
2
@davidmneedham Нет, большинство чисел хранятся в двоичном виде. BCD используется для редких специализированных целей, но большинство кодировок - это целые числа или числа с плавающей запятой. В этих системах ответ журнала является правильным, он дает минимальное количество бит для хранения всех чисел заданной десятичной длины (округление вверх) и объясняет, почему данное число бит не хранит фиксированное количество десятичных цифр.
Джек Эйдли
7

BCD - Binary Coded Decimal использует 4 бита на цифру, так же, как шестнадцатеричный.

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

CWS Matt
источник
За исключением того, что «BCD» часто используется для обозначения 6-битной кодировки символов.
Даниэль Р Хикс
@MrLister - en.wikipedia.org/wiki/BCD_(character_encoding)
Даниэль Р Хикс
@DanielRHicks Ах, хорошо. Википедия говорит, что она использовалась в конце 1950-х и начале 1960-х годов (то есть до изобретения EBCDIC), поэтому мне не стыдно, что я об этом никогда не слышала. Хотя теперь я понимаю, что название EBCDIC произошло от него! В любом случае, термин BCD все еще не «часто используется» для обозначения кодировки, как вы говорите.
Мистер Листер
3

Использование битов подразумевает степень 2, поэтому, как уже говорили другие, вы не можете легко собрать 10 бит в байты без потерь. Обычное решение - использовать 4 бита в шестнадцатеричном формате и тратить 6 состояний, представленных как AF. Интересный момент - делать десятичную математику с этим - это не аккуратно и просто.

Полезной идеей преподавания может быть сравнение того, как Микки Маус разработал систему подсчета, поскольку у него всего 4 пальца на руку, что естественно приводит к восьмеричной системе.

davidgo
источник
Я полагаю, что вы хотели сослаться на Hex в своем ответе как на Hex со значениями AF
user92592
@ user92582 да, та. Исправлено.
Давидго
И вы можете использовать эти «ненужные» 6 состояний для кодирования десятичной точки, отрицания, конца последовательности и т. Д. Что касается десятичной математики ... это не просто, а просто? Просто напишите какой-нибудь код, чтобы делать то, чему мы учим маленьких детей: p
Kaithar
@kaithar - я не верю, что то, что вы предлагаете, является действительным, так как для любой из этих операций потребуется полный бит или больше - чего у вас нет в наличии.
Давидго
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 ...

Acccumulation
источник
2
  • Шестнадцатеричный (основа 16) - 4 бита
  • Восьмеричное (основание 8) - 3 бита
  • Бинарный (база 2) - 1 бит
  • Десятичное число (основание 10) - 3 1/3 бита.
    2 10 = 1 024
    10 3 = 1 000
    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 десятичных цифр, но вы не можете представить все 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: опять же, моя перспектива - использовать целочисленные типы фиксированной ширины - 1001001отображается в 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 бита на цифру), но нет никакого соответствия между двоичным кодированием любой из цифр и двоичным кодированием значения. Если вы используете какую-либо форму двоичного кодирования для десятичных цифр, то либо ширина должна быть фиксированной как 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 (это 2000 или 2048?). Это достаточно хорошо для быстрых приближений. 2 ^ 16 составляет около 2 ^ (16 - 10) * 1000, или 2 ^ 6 (64) * 1000 или 64 000. На самом деле, это 65 536, но если вы не возражаете против того, чтобы быть в процентах, он работает довольно быстро для быстрого приближения.

Дейл Чатем
источник
Хотя это умное понимание и ценный вклад в учебную программу ОП, это не ответ на вопрос.
Скотт