Я собираюсь рассказать небольшой группе людей о системах нумерации в вычислительной технике, и мне было интересно, сколько битов на цифру содержится в десятичной системе, например:
Шестнадцатеричный (основа 16) - 4 бита
Восьмеричное (основание 8) - 3 бита
Двоичный (база 2) - 1 бит
Десятичное число (основание 10) -?
Интуиция: скажем, что вы ищете, это `d`, оно охватывает одну десятичную цифру, диапазон` 0..9`. Биты `3 * d` означают три десятичных знака и позволяют вам представлять целые числа из диапазона` 0..999`. Целые десять битов (подумайте двоично) дают диапазон `0..1023`. 999 довольно близко к 1023, но немного меньше. Таким образом, вы можете ожидать, что `d` должно быть чуть меньше 10/3.
Kamil Maciorowski 6 лет назад
7
Похоже, этот пост лучше подходит для переполнения стека, чем для суперпользователя.
gmarmstrong 6 лет назад
5
@gmarmstrong: Я бы поспорил с Mathematics.SE (или, возможно, SoftwareEngineering.SE). Это не имеет прямого отношения к проблеме программирования.
Flater 6 лет назад
21
@Flater: [math.se] определенно правильное место, так как это в основном теория информации 101.
David Stockinger 6 лет назад
10
Пока мы связываем другие SE, OP может заинтересоваться [Преподавателями компьютерных наук] (https://cseducators.stackexchange.com/), учитывая его контекст. (это не очень хорошее место для публикации этого вопроса, но это может пригодиться в будущем)
Aaron 6 лет назад
3
Нет ничего постыдного в том, что я этого не знаю, но тот, кто не может быть не лучшим человеком для обучения систем счисления.
WGroleau 6 лет назад
7
По крайней мере, в области математики с плавающей запятой вопрос действительно бессмысленный, потому что числа представлены в двоичной форме научной нотации (IEEE 754). Таким образом, числа 1.0 и (приблизительно) 100000000000.0 требуют одинаковых 8 байтов / 64 битов (с двойной точностью), 52 мантиссы, 11 показателей степени и 1 знакового бита.
jamesqf 6 лет назад
0
Я бы сказал, что вопрос плохо сформирован. База-2 и база-10 несоизмеримы. Вы даже не должны думать о «битах на цифру». Вопрос имеет смысл в шестнадцатеричном или базовом-64, но не десятичном.
user207421 6 лет назад
0
Не более плохо сформирован, чем «Что такое 4 минус 7?» или «Каковы квадратные корни из 2?». На эти вопросы нет ответов в натуральных числах, но они имеют последовательные, полезные ответы, если вы выходите за их пределы, и то же самое можно сказать и об этом: десятичная цифра занимает чуть меньше 3⅓ битов, поэтому три из них вместе будут вписываться в 3 × 3 = 10 бит, шесть на 20 бит и т. Д.
deltab 6 лет назад
1
@jamesqf Плавающие точки - это способ отображения абстрактного понятия числа в битовую строку фиксированной длины. Они не являются специфическими для десятичной дроби, числа по своей природе не являются десятичными. Поэтому, если мы последуем вашим рассуждениям, вы даже не сможете сказать, что двоичная цифра равна 1 биту, а шестнадцатеричная цифра - 4 бита, поскольку для двоичного числа из 1 цифры при преобразовании в число с плавающей запятой также потребуется 64 бита. Вы можете определенно говорить о количестве битов на цифру в разных базах, и из-за причины, которую вы указали, вам не следует рассматривать их представление как число с плавающей запятой, чтобы выяснить это.
FrederikVds 6 лет назад
0
@jamesqf Число 100000000000.0 на самом деле точно представлено в двоичном коде 64, поэтому нет необходимости говорить «(приблизительно)».
Mr Lister 6 лет назад
0
@Mr Lister: хорошо, но как насчет 100000000000.123? Моя точка зрения заключалась в том, что «бит на цифру» имеет смысл только в определенных контекстах. Таким образом, вы можете представить любое целое число до 2 ^ n - 1 в n битах, рассматривая n бит как цифру. (хотя представьте себе удовольствие от 2 ^ 64 уникальных символов - лучше, чем Unicode :-)). Или вы можете представить десятичное число в ASCII с 8 битами на цифру, с некоторыми дополнительными. Или используйте Binary Coded Decimal, аппаратное обеспечение для которого все еще может быть в вашем последнем процессоре Pentium.
jamesqf 6 лет назад
1
Исторически сложилось, что двумя наиболее распространенными компьютерными представлениями десятичной дроби были прямое 4-битное кодирование (с шестью комбинациями, оставленными неиспользованными) и * centesimal *, 7-битная кодировка значений 0-99 (с 28 комбинациями, оставленными неиспользованными). ).
Daniel R Hicks 6 лет назад
0
@WGroleau Я не согласен. Полезность этого числа (основание журнала 2 из 10) в большинстве случаев является просто точкой интереса, а не точкой ужасной полезности, когда речь идет о представлении целых чисел, чисел с фиксированной запятой или чисел с плавающей запятой. Другие вопросы, такие как выразимость 0,1 в основаниях без 5 как основной фактор (упомянутый ниже), гораздо более полезны. Хотя я, конечно, могу придумать это число и предположить, что многие люди, знакомые с системами счисления, могли бы расширить концепции, чтобы придумать его, я НИКОГДА ** не использовал это число при любом преобразовании основ или мышлении.
CrazyCasta 6 лет назад
0
Моя точка зрения не в том, полезен номер или нет, а в том, готов ли кто-то, кому нужна вся эта дискуссия, преподавать предмет.
WGroleau 6 лет назад
2
То, что вы ищете, это логарифм на основе 2, равный 10, что является иррациональным числом около 3.32192809489 ....
Тот факт, что вы не можете использовать целое число битов для десятичной цифры, является основной причиной того, почему многие дроби, которые легко выразить в десятичной системе (например, 1/5 или 0,2), невозможны (не сложно: действительно невозможно) выразить в двоичном виде. Это важно при оценке ошибок округления в арифметике с плавающей запятой.
Комментарии не для расширенного обсуждения; этот разговор был [перемещен в чат] (http://chat.stackexchange.com/rooms/69519/discussion-on-answer-by-eugen-rieck-how-many-bits-per-digit-in-the- десятичный-сист).
DavidPostill 6 лет назад
0
21
gronostaj
Другими словами, какое количество информации содержится в одной цифре в этих системах.
Для базы 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, не являются кардинальными числами. Особенно:
Это число может показаться запутанным, но на самом деле оно имеет некоторое применение. Например, это энтропия одной десятичной цифры.
Для вашего случая, однако, я не думаю, что это значение имеет какое-либо значение. Ответ @ Кристиана хорошо объясняет почему.
10
Christian
На предмет битов:
Мне жаль говорить, что вопрос неверный. Вы не будете использовать биты таким образом. Бит - это двоичная цифра . Вы можете преобразовать десятичное число 10 в двоичное число 1010 (8 + 2), поэтому вам потребуется 4 бита для выражения десятичного значения 10.
Полномочия 2
Вы попали в ловушку, используя двоичные (2), восьмеричные (8) и шестнадцатеричные (16) в качестве примеров, потому что это все степени 2, и, таким образом, вы можете думать о них в терминах битов, в то время как 10 не является степенью 2, так что это просто не очень хорошо работает.
Вопрос не ошибочный. В области теории информации совершенно нормально говорить о битах таким образом. И тогда ответ Евгения Рика - хороший ответ.
Pakk 6 лет назад
18
Правда, вы могли бы сделать то, что предложил Eugen Riecek, и использовать float, а не int, чтобы описать это, и получить реальный ответ из этого. Я не уверен, что вы будете использовать этот ответ _for_ точно, но это ни здесь, ни там.
Christian 6 лет назад
0
Я предлагаю упомянуть BCD (двоично-десятичный десятичный код), который обычно представлен 4-разрядными в электронике. На практике количество битов, используемых для представления десятичного числа, обычно равно 4, но это зависит от реализации.
davidmneedham 6 лет назад
2
@davidmneedham Причина, по которой они были закодированы 4-мя битами, заключается в том, что, как указал Евгений Рик, десятичные цифры имеют 3
David Stockinger 6 лет назад
0
@DavidStockinger Правильно, это зависит от того, является ли это теоретическим вопросом или вопросом реализации.
davidmneedham 6 лет назад
1
@ davidmneedham Нельзя иметь одно без другого. Если * log2 (X) * равно * n *, то вам нужно как минимум n бит для хранения цифры в базе * X *
David Stockinger 6 лет назад
0
ln (10) / ln (2) - теоретический ответ. 4 бита - вероятный ответ реализации.
davidmneedham 6 лет назад
2
@davidmneedham Нет, большинство чисел хранятся в двоичном виде. BCD используется для редких специализированных целей, но большинство кодировок - это целые числа или десятичные числа с плавающей запятой. В этих системах ответ журнала является правильным, он дает минимальное количество битов для хранения всех чисел заданной десятичной длины (округление вверх) и объясняет, почему данное число битов не хранит фиксированное количество десятичных цифр.
Jack Aidley 6 лет назад
2
8
CWS Matt
BCD - Binary Coded Decimal использует 4 бита на цифру, так же, как шестнадцатеричный.
За исключением того, что «BCD» часто используется для обозначения 6-битной кодировки символов.
Daniel R Hicks 6 лет назад
0
@MrLister - https://en.wikipedia.org/wiki/BCD_(character_encoding)
Daniel R Hicks 6 лет назад
0
@DanielRHicks Ах, хорошо. Википедия говорит, что она использовалась в конце 1950-х и начале 1960-х годов (то есть до изобретения EBCDIC), поэтому мне не стыдно, что я об этом никогда не слышала. Хотя теперь я понимаю, что название EBCDIC произошло от него! В любом случае, термин BCD все еще не «часто используется» для обозначения кодировки, как вы говорите.
Mr Lister 6 лет назад
0
3
davidgo
Использование битов подразумевает степень 2, поэтому, как уже говорили другие, вы не можете легко собрать 10 бит в байты без потерь. Общее решение состоит в том, чтобы использовать 4 бита в шестнадцатеричном формате и тратить 6 состояний, представленных как AF. С этим интересно работать с десятичной математикой - она не изящная и не простая.
Полезной идеей преподавания может быть сравнение того, как Микки Маус разработал систему подсчета, поскольку у него всего 4 пальца на руку, что естественно приводит к восьмеричной системе.
Я полагаю, что вы хотели сослаться на Hex в своем ответе как на Hex со значениями AF
user92592 6 лет назад
0
@ user92582 да, та. Исправленный.
davidgo 6 лет назад
0
И вы можете использовать эти «ненужные» 6 состояний, чтобы закодировать десятичную точку, минус, терминатор последовательности и т. Д. Что касается десятичной математики ... это не аккуратно, а просто? Просто напишите код, чтобы делать то, чему мы учим маленьких детей: p
Kaithar 6 лет назад
0
@kaithar - я не верю, что то, что вы предлагаете, является действительным, так как для любой из этих операций потребуется полный бит или больше - чего у вас нет в наличии.
davidgo 6 лет назад
0
Возможно, вы неверно истолковали мой смысл, но в целом предложение совершенно правильно ... это стандартное кодирование символов. Скажем, 0000-1001 - это обычный BCD, 1010 - десятичный разделитель, 1110 - отрицательный знак и 1111 - терминатор. Конечно, вам нужна математическая библиотека, которая понимает это, но вам уже нужно что-то странное, когда вы кодируете числа в виде последовательности кусков.
Kaithar 6 лет назад
0
Не знаю, откуда берутся «10 битов». 10 бит = 1024 значения. Десятичная цифра имеет только 10 возможных значений.
MSalters 6 лет назад
1
@MSalters Опечатка из 10 штатов.
wizzwizz4 6 лет назад
0
3
Justin Ohms
Это может быть упрощением, но это зависит от того, какой вопрос вы задаете. (и ответ в основном восьмеричный или шестнадцатеричный)
Я также не рассматриваю дробные биты как биты, потому что в практическом использовании биты не имеют дробей.
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
Acccumulation
В базе 1024 каждый символ составляет 10 битов. Три десятичных знака имеют такое же количество информации, что и одна цифра в базе 1000, что немного меньше 1024. Следовательно, десятичная цифра имеет чуть меньше 10/3 бит. Это приближение дает 3.333333 ..., а точное число составляет 3.321928 ...
1
Russell Hankins
Шестнадцатеричный (основа 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 6 лет назад
0
0
John Bode
Отказ от ответственности - я не теоретик информации, а просто обезьяна кода, которая работает в основном на 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-битные слова являются нормой, тогда восьмеричный смысл имеет больше смысла, поскольку биты естественно группируются в тройки.
На самом деле среднее значение на цифру меньше, поскольку для 0 и 1 требуется только один бит, а для 2 и 3 требуется только 2 бита. Но на практике мы считаем, что от 0 до 7 занимают 3 бита. Просто облегчает жизнь во многих отношениях.
Это не так просто; например, этого 3-х или 4-х битного кодирования недостаточно, чтобы сказать, должно ли `1001001` быть` 91 'или `49`.
Hurkyl 6 лет назад
4
@Hurkyl: опять же, моя перспектива - использовать целочисленные типы фиксированной ширины - `1001001` отображается на` 73` (`64 + 8 + 1`). Я не интерпретирую это как последовательность двоично-десятичных цифр. Если это * предполагается * BCD, который должен использовать 4 бита на цифру, то мы должны принять начальный бит `0`, поэтому он должен быть` 49`.
John Bode 6 лет назад
0
Я просто пытался указать, что кодировки переменной длины не так просты, как вы их себе представляете; Вы должны сказать, где заканчивается один символ и начинается другой. поэтому нельзя просто сказать, что вы можете представлять 8 и 9 с четырьмя битами, 4-7 с тремя, 2-3 с двумя и 0-1 с одним. И вы можете видеть, что полученная вами цифра «3.2» на самом деле нарушает границы теории информации для «log (10) / log (2)».
Hurkyl 6 лет назад
2
@Hurkyl: я не пытался сделать что-нибудь простое, и при этом я не говорил о какой-либо кодировке. Наибольшее значение, которое может быть представлено в 32-разрядном целом числе, имеет ширину 10 десятичных цифр (3,2 бита на цифру), но нет никакого соответствия между двоичным кодированием любой из цифр и двоичным кодированием значения. Если вы используете какую-то форму двоичного кодирования для десятичных цифр, то либо ширина должна быть фиксированной * a la * BCD, либо вы должны использовать какое-то кодирование Хаффмана, которое я не защищаю.
John Bode 6 лет назад
0
Вы можете закодировать 16-значное число 32-разрядным, если вы объявите, что оно представлено 01. Но это не то, что имеют в виду люди, когда говорят о том, сколько цифр требуется для кодирования десятичных цифр, и ни о чем вы не говорите.
Acccumulation 6 лет назад
0
Проблема с этой схемой состоит в том, что вы забыли один дополнительный бит, который вам нужен, чтобы указать, следует ли 3 или 4 бита. А со средней длиной 4,2 бита на десятичную цифру это даже хуже, чем BCD
MSalters 6 лет назад
1
Вы можете * представлять * значения> 255 просто в 8 битах. Вы просто не можете представить * более 256 дискретных значений * в 8 битах. Обычно мы выбираем отображение 8-битного пространства в диапазон \ [+ 0 .. + 255 \] (без знака) или \ [- 128 .. + 127 \] (со знаком, два с дополняющими обозначениями), но нет причин почему мы должны выбрать именно это отображение, если какое-то другое отображение имеет больше смысла для конкретного приложения. Для реального примера это то, сколько форматов файлов изображений представляют сопоставления от значений 8-битных байтов (один байт на пиксель для хранения) до значений 24-битных цветов RGB (для отображения) через справочную таблицу.
a CVn 6 лет назад
0
@MSalters Кодировки переменной длины также, как известно, легко испортить, особенно парсеры. Я приветствую некоторые из рассуждений, которые вошли в UTF-8, в том числе тот факт, что US-ASCII автоматически является действительным UTF-8 на уровне байтов, но между ним и несколькими кодовыми точками Unicode, объединяющимися в один символ, как это появляется на экране, скажем так, я рад, что мне не пришлось писать Unicode-анализатор UTF-8 даже для чего-то простого, например, для нахождения количества символов в строке или для извлечения подстроки. Художник Шлемель все это время делал правильно!
a CVn 6 лет назад
0
0
Dale Chatham
Если бы я учил этому, я бы сначала объяснил, что означает число (выраженное в виде серии цифр). то есть справа налево, предполагая, что база 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, но если вы не возражаете против того, чтобы быть в процентах, он работает довольно быстро для быстрого приближения.
Хотя это умное понимание и ценный вклад в учебную программу ОП, это не ответ на вопрос.
Scott 6 лет назад
0