Combien de bits par chiffre dans le système décimal [fermé]


29

Je vais enseigner à un petit groupe de personnes les systèmes de numérotation en informatique et je me demandais combien de bits par chiffre y avait-il dans le système décimal, par exemple:

  • Hex (base 16) - 4 bits
  • Octal (base 8) - 3 bits
  • Binaire (base 2) - 1 bit
  • Décimal (base 10) -?

7
Intuition: Disons que ce que vous cherchez d, c'est qu'il couvre un chiffre décimal, la plage de 0..9. 3*dles bits signifient trois chiffres décimaux et vous permettent de représenter des entiers de la plage 0..999. Dix bits entiers (pensez binaire maintenant) donnent une plage de 0..1023. 999 est assez proche de 1023, mais un peu moins. Vous pouvez donc vous attendre à dun peu moins de 10/3.
Kamil Maciorowski

5
Ce message semble correspondre mieux à Stack Overflow qu'à Super User.
gmarmstrong

21
@gmarmstrong: Je dirais que Mathematics.SE (ou peut-être SoftwareEngineering.SE). Ce n'est pas directement lié à un problème de programmation.
Flater

10
@Flater: Les mathématiques sont définitivement le bon endroit, car il s'agit essentiellement de la théorie de l'information 101.
MechMK1

7
Il n'y a pas de honte à ne pas le savoir, mais celui qui ne l'est pas n'est peut-être pas la meilleure personne pour enseigner les systèmes numériques.
WGroleau

Réponses:


97

Ce que vous recherchez est le logarithme basé sur 2 de 10, ce qui est un nombre irrationnel d'environ 3,32192809489 ....

Le fait que vous ne pouvez pas utiliser un nombre entier de bits pour un chiffre décimal est la cause première de la raison pour laquelle de nombreuses fractions faciles à exprimer dans le système décimal (par exemple 1/5 ou 0,2) sont impossibles (pas difficiles: vraiment impossible) à exprimer en binaire. Ceci est important lors de l'évaluation des erreurs d'arrondi dans l'arithmétique à virgule flottante.


Les commentaires ne sont pas pour une discussion approfondie; cette conversation a été déplacée vers le chat .
DavidPostill

20

En d'autres termes, quelle quantité d'informations est contenue dans un seul chiffre dans ces systèmes.

Pour la base 2, la base 4, la base 8, la base 16 et les autres 2 N bases, la réponse est évidente car dans une base 2 N, chaque chiffre peut être exprimé avec exactement N chiffres.

Comment obtenez-vous N donné 2 N ? Eh bien, vous utilisez un logarithme basé sur 2, qui est l'inverse de l'exponentiation.

  • log 2 2 = 1 (1 bit par chiffre en base 2)
  • log 2 4 = 2 (2 bits par chiffre en base 4)
  • log 2 8 = 3 (3 bits par chiffre en base 8)
  • log 2 16 = 4 (4 bits par chiffre en base 16)

Les logarithmes basés sur K des nombres qui ne sont pas des puissances de K ne sont pas des nombres cardinaux. En particulier:

  • log 2 10 = 3,321928094887362347870319429489390175864831393024580612054…

Ce nombre peut sembler déroutant, mais il a en fait quelques utilisations. Par exemple, il s'agit d'une entropie d'un seul chiffre décimal.

Pour votre cas, cependant, je ne pense pas que cette valeur soit utile. @ La réponse de Christian explique bien pourquoi.


8

Au sujet des bits:

Je suis désolé de dire que la question est erronée. Vous n'utiliseriez pas les bits de cette manière. Un bit est un chiffre binaire . Vous pouvez convertir le nombre décimal 10 en 1010 binaire (8 + 2), vous aurez donc besoin de 4 bits pour exprimer la valeur décimale 10.


Pouvoirs de 2

Vous êtes tombé dans un piège, en utilisant les exemples binaire (2), octal (8) et hexadécimal (16), car ce sont tous des puissances de 2, et donc vous pouvez les considérer en termes de bits, alors que 10 n'est pas une puissance de 2, donc ça ne marche pas très bien comme ça.


18
La question n'est pas erronée. Dans le domaine de la théorie de l'information, il est parfaitement normal de parler de bits de cette manière. Et puis la réponse d'Eugen Rieck est une bonne réponse.

2
Je suggère que vous mentionniez BCD (décimal codé binaire), qui est couramment représenté par 4 bits en électronique. En termes pratiques, le nombre de bits utilisés pour représenter un nombre décimal est généralement de 4, mais cela dépend de la mise en œuvre.
davidmneedham

1
@DavidStockinger Bon, cela dépend s'il s'agit d'une question théorique ou d'une question d'implémentation.
davidmneedham

2
ln (10) / ln (2) est la réponse théorique. 4 bits est la réponse d'implémentation probable.
davidmneedham

2
@davidmneedham Non, la plupart des nombres sont stockés en binaire. BCD est utilisé à de rares fins spécialisées, mais la plupart des codages sont des nombres décimaux entiers ou à virgule flottante. Dans ces systèmes, la réponse du journal est la bonne, elle donne un nombre minimum de bits pour stocker tous les nombres d'une longueur décimale donnée (arrondie) et explique pourquoi un nombre donné de bits ne stocke pas un nombre fixe de chiffres décimaux.
Jack Aidley

7

BCD - Binary Coded Decimal utilise 4 bits par chiffre, le même que Hexadecimal.

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


Sauf que "BCD" est souvent utilisé pour faire référence au codage de caractères à 6 bits.
Daniel R Hicks


@DanielRHicks Ah, OK. Wikipedia dit qu'il a été utilisé à la fin des années 1950 et au début des années 1960 (c'est-à-dire avant que EBCDIC ait été inventé), donc je n'ai pas honte de ne jamais en avoir entendu parler. Même si je me rends compte maintenant que le nom EBCDIC en est dérivé! Quoi qu'il en soit, le terme BCD n'est pas encore "souvent utilisé" pour désigner l'encodage comme vous le dites.
M. Lister

3

L'utilisation de bits implique une puissance de 2, donc, comme d'autres l'ont dit, vous ne pouvez pas facilement découper 10 bits en octets sans gaspillage. Une solution courante consiste à utiliser 4 bits selon l'hexadécimal et à gaspiller les 6 états représentés comme AF. Le plus intéressant est de faire des calculs décimaux avec cela - ce n'est pas simple et net.

Une idée pédagogique utile pourrait être de comparer la façon dont Micky Mouse a pu développer un système de comptage, car il n'a que 4 doigts par main - ce qui conduit naturellement à un système octal.


Je pense que vous vouliez faire référence à Hex dans votre réponse comme étant son Hex qui a les valeurs AF
user92592

@ user92582 oui, ta. Corrigée.
davidgo

Et vous pouvez utiliser ces "6 déchets" pour coder un point décimal, un négatif, un terminateur de séquence, etc. Quant aux mathématiques décimales ... ce n'est pas net mais simple? Il suffit d'écrire du code pour faire ce que nous enseignons aux petits enfants: p
Kaithar

@kaithar - Je ne pense pas que ce que vous proposez soit valide, car l'une de ces opérations nécessiterait un peu plus ou plus - ce que vous n'avez pas disponible.
davidgo

1
Aucune idée d'où viennent les "10 bits". 10 bits = 1024 valeurs. Un chiffre décimal n'a que 10 valeurs possibles.
MSalters

3

Cela peut être une simplification excessive, mais cela dépend de la question que vous posez.
(et la réponse est essentiellement octale ou hexadécimale)

Je ne considère pas non plus les bits fractionnaires comme des bits car dans la pratique, les bits n'ont pas de fractions.

Q1: Combien de bits pouvez-vous représenter dans un chiffre décimal ?

A1: Vous pouvez représenter 3 bits d'informations en un seul chiffre décimal:

Le schéma le plus courant serait un binaire simple avec habillage où 0 = 8 = 000 et 1 = 9 = 001. Mais vous pouvez utiliser n'importe quel schéma, rien ne dit que c'est la seule façon de coder les bits en chiffres décimaux.

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- emballage (ou inutilisé)
  • 9: 001 <- emballage (ou inutilisé)

ou

Q2: Combien de bits faut-il pour représenter un chiffre décimal?

A2: Vous avez besoin d'au moins 4 bits pour représenter tous les chiffres décimaux. Avec quelques déchets ou emballages.

Encore une fois, le schéma le plus courant serait un binaire simple avec habillage, mais vous pouvez utiliser n'importe quel autre schéma.

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 0: 1010 <- emballage (ou inutilisé)
  • 1: 1011 <- emballage (ou inutilisé)
  • 2: 1100 <- emballage (ou inutilisé)
  • 3: 1101 <- emballage (ou inutilisé)
  • 4: 1110 <- emballage (ou inutilisé)
  • 5: 1111 <- emballage (ou inutilisé)

2

En base 1024, chaque symbole fait 10 bits. Trois chiffres décimaux ont la même quantité d'informations qu'un chiffre de la base 1000, ce qui est légèrement inférieur à 1024. Par conséquent, un chiffre décimal a un peu moins de 10/3 bits. Cette approximation donne 3.333333 ..., tandis que le nombre exact est 3.321928 ...


2
  • Hex (base 16) - 4 bits
  • Octal (base 8) - 3 bits
  • Binaire (base 2) - 1 bit
  • Décimal (base 10) - 3 1/3 bits.
    2 10 = 1 024
    10 3 = 1 000
    2 20 = 1 048 576
    10 6 = 1 000 000
    3 chiffres en base 10 jusqu'à 999 peuvent être conservés en 10 bits en base 2.
    6 chiffres en base 10 jusqu'à 999 999 peuvent être conservés en 20 bits en base 2.
    C'est là qu'est née l'idée des kilo-octets, des mégaoctets et des gigaoctets.

C'est en fait un peu moins de 3 1/3 ... Votre réponse est un peu ambiguë, et la suggestion que des nombres jusqu'à 999 peuvent être stockés au lieu de nombres entre 0-1023 est un peu trompeuse.
wizzwizz4

0

Avertissement - Je ne suis pas un théoricien de l'information, juste un singe de code qui travaille principalement en C et C ++ (et donc avec des types à largeur fixe), et ma réponse va être de ce point de vue particulier.

Il faut en moyenne 3,2 bits pour représenter un chiffre décimal - 0 à 7 peut être représenté en 3 bits, alors que 8 et 9 nécessitent 4. (8*3 + 2*4)/10 == 3.21 .

C'est moins utile qu'il n'y paraît. D'une part, vous n'avez évidemment pas de fractions de bit. D'autre part, si vous utilisez des types entiers natifs (c'est-à-dire pas BCD ou BigInt), vous ne stockez pas de valeurs sous la forme d'une séquence de chiffres décimaux (ou leurs équivalents binaires). Un type à 8 bits peut stocker certaines valeurs qui prennent jusqu'à 3 chiffres décimaux, mais vous ne pouvez pas représenter toutes les valeurs à 3 chiffres décimaux sur 8 bits - la plage est [0..255]. Vous ne pouvez pas représenter les valeurs [256..999]en seulement 8 bits.

Lorsque nous parlons de valeurs , nous utiliserons la décimale si l'application s'y attend (par exemple, une application de banque numérique). Lorsque nous parlons de bits , nous utilisons généralement hexadécimal ou binaire (je n'utilise presque jamais octal car je travaille sur des systèmes qui utilisent des octets 8 bits et des mots 32 bits, qui ne sont pas divisibles par 3).

Les valeurs exprimées en décimales ne correspondent pas correctement aux séquences binaires. Prenez la valeur décimale 255. Les équivalents binaires de chaque chiffre serait 010, 101, 101. Pourtant, la représentation binaire de la valeur 255est 11111111. Il n'y a simplement aucune correspondance entre une des décimales de la valeur à la séquence binaire. Mais il existe une correspondance directe avec des chiffres hexadécimaux - F == 1111, de sorte que la valeur peut être représentée comme FFen hexadécimal.

Si vous êtes sur un système où les octets de 9 bits et les mots de 36 bits sont la norme, alors octal a plus de sens puisque les bits se regroupent naturellement en trois.


  1. En fait, la moyenne par chiffre est plus petite puisque 0 et 1 ne nécessitent qu'un seul bit, tandis que 2 et 3 ne nécessitent que 2 bits. Mais, en pratique, nous considérons 0 à 7 pour prendre 3 bits. Simplifie la vie de plusieurs façons.


4
Ce n'est pas aussi simple que cela; par exemple, ce codage à 3 ou 4 bits n'est pas suffisant pour dire s'il 1001001doit être 91ou 49.

@Hurkyl: encore une fois, ma perspective utilise des types entiers à largeur fixe - 1001001correspond à 73( 64 + 8 + 1). Je ne l'interprète pas comme une séquence de chiffres décimaux codés binaires. Si c'est censé être BCD, qui doit utiliser 4 bits par chiffre, alors nous devons supposer un 0bit de tête , il doit donc l'être 49.
John Bode

2
J'essayais juste de souligner que les encodages de longueur variable ne sont pas aussi simples que vous le faites croire; vous devez dire où se termine un symbole et où commence un autre. vous ne pouvez donc pas simplement dire que vous pouvez représenter 8 et 9 avec quatre bits, 4-7 avec trois, 2-3 avec deux et 0-1 avec un. Et vous pouvez voir que le 3.2chiffre que vous obtenez viole réellement la limite de la théorie de l'information log(10)/log(2).

@Hurkyl: Je n'essayais pas de faire quelque chose de simple, et je ne parlais d'aucune sorte d'encodage. La plus grande valeur qui peut être représentée dans un entier 32 bits est large de 10 chiffres décimaux (3,2 bits par chiffre), mais il n'y a aucune correspondance entre le codage binaire de l'un des chiffres et le codage binaire de la valeur. Si vous utilisez une forme de codage binaire pour les chiffres décimaux, alors soit la largeur doit être fixée à la BCD, soit vous devez utiliser une sorte de codage Huffman, ce que je ne préconise pas.
John Bode

1
Le problème avec ce schéma est que vous avez oublié le bit supplémentaire dont vous avez besoin pour indiquer si 3 ou 4 bits suivent. Et avec une longueur moyenne de 4,2 bits par chiffre décimal, c'est encore pire que BCD
MSalters

0

Si j'enseignais cela, j'expliquerais d'abord ce que signifie un nombre (exprimé en une série de chiffres). c'est-à-dire de droite à gauche, en supposant la base n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.

Expliquez ensuite que 10 ^ 3 est approximativement égal à 2 ^ 10. Ce n'est pas exact et c'est la raison dans les ordinateurs, nous ne savons souvent pas ce que signifie vraiment 2k (est-ce 2000 ou 2048?) Il sert assez bien pour des approximations rapides. 2 ^ 16 est d'environ 2 ^ (16 - 10) * 1 000, ou 2 ^ 6 (64) * 1 000 ou 64 000. En réalité, il est de 65 536, mais si cela ne vous dérange pas d'être à environ un pour cent, cela fonctionne assez bien pour des approximations rapides.


Bien qu'il s'agisse d'un aperçu intelligent et d'une contribution précieuse au programme de cours du PO, ce n'est pas une réponse à la question.
Scott
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.