Wie viele Bits pro Ziffer im Dezimalsystem [geschlossen]

28

Ich werde eine kleine Gruppe von Leuten über die Nummerierungssysteme beim Rechnen unterrichten und habe mich gefragt, wie viele Bits pro Ziffer es im Dezimalsystem gibt, zum Beispiel:

  • Hex (Basis 16) - 4 Bits
  • Oktal (Basis 8) - 3 Bits
  • Binär (Basis 2) - 1 Bit
  • Dezimalzahl (Basis 10) -?
user92592
quelle
7
Intuition: Sagen wir, Sie suchen nach deiner Dezimalstelle, dem Bereich von 0..9. 3*dBits bedeuten drei Dezimalstellen und ermöglichen die Darstellung von Ganzzahlen aus dem Bereich 0..999. Ganze zehn Bits (denke jetzt binär) ergeben einen Bereich von 0..1023. 999 ist ziemlich nah an 1023, aber etwas weniger. Man kann also erwarten, ddass etwas weniger als 10/3 sein sollte.
Kamil Maciorowski
5
Dieser Beitrag scheint auf Stack Overflow besser zu passen als auf Super User.
gmarmstrong
21
@gmarmstrong: Ich würde Mathematics.SE (oder möglicherweise SoftwareEngineering.SE) argumentieren. Dies hängt nicht direkt mit einem Programmierproblem zusammen.
Flater
10
@Flater: Mathematik ist definitiv der richtige Ort, da dies im Grunde Informationstheorie 101 ist.
MechMK1
7
Es ist keine Schande, dies nicht zu wissen, aber einer, der nicht der beste Mensch ist, um Zahlensysteme zu lehren.
WGroleau

Antworten:

96

Was Sie suchen, ist der 2-basierte Logarithmus von 10, was eine irrationale Zahl von etwa 3,32192809489 ist ....

Die Tatsache, dass Sie keine ganzzahlige Anzahl von Bits für eine Dezimalstelle verwenden können, ist die Hauptursache dafür, dass viele Brüche, die im Dezimalsystem leicht auszudrücken sind (z. B. 1/5 oder 0,2), unmöglich sind (nicht schwer: wirklich) unmöglich) binär auszudrücken. Dies ist wichtig bei der Auswertung von Rundungsfehlern in Gleitkomma-Arithmetiken.

Eugen Rieck
quelle
Kommentare sind nicht für eine längere Diskussion gedacht. Diese Unterhaltung wurde in den Chat verschoben .
DavidPostill
20

Mit anderen Worten, welche Informationsmenge ist in diesen Systemen in einer einzelnen Ziffer enthalten.

Für Basis 2, Basis 4, Basis 8, Basis 16 und andere 2 N- Basen ist die Antwort offensichtlich, da in einer Basis 2 N jede Ziffer mit genau N Ziffern ausgedrückt werden kann.

Wie bekommt man N 2 N gegeben ? Nun, Sie verwenden einen 2-basierten Logarithmus, der eine Umkehrung der Potenzierung ist.

  • log 2 2 = 1 (1 Bit pro Ziffer in Basis 2)
  • log 2 4 = 2 (2 Bits pro Ziffer in Basis 4)
  • log 2 8 = 3 (3 Bits pro Ziffer in Basis 8)
  • log 2 16 = 4 (4 Bits pro Ziffer in Basis 16)

K-basierte Logarithmen von Zahlen, die keine Potenzen von K sind, sind keine Kardinalzahlen. Bestimmtes:

  • log 2 10 = 3.321928094887362347870319429489390175864831393024580612054…

Diese Nummer mag verwirrend aussehen, hat aber tatsächlich einige Verwendungszwecke. Zum Beispiel ist es eine Entropie einer einzelnen Dezimalstelle.

Für Ihren Fall halte ich diesen Wert jedoch nicht für sinnvoll. @Christians Antwort ist gut darin zu erklären, warum.

gronostaj
quelle
8

Zum Thema Bits:

Es tut mir leid zu sagen, dass die Frage falsch ist. Sie würden Bits auf diese Weise nicht verwenden. Ein Bit ist eine Binärziffer . Sie können die Dezimalzahl 10 in eine Binärzahl 1010 (8 + 2) umwandeln, sodass Sie 4 Bits benötigen, um den Dezimalwert 10 auszudrücken.


Potenzen von 2

Sie sind in eine Falle geraten, indem Sie als Beispiele binär (2), oktal (8) und hexadezimal (16) verwenden, weil dies alles Potenzen von 2 sind, und Sie können sich diese also in Bits vorstellen. wohingegen 10 keine Potenz von 2 ist, funktioniert es einfach nicht so gut.

Christian
quelle
18
Die Frage ist nicht falsch. In der Informationstheorie ist es völlig normal, auf diese Weise über Bits zu sprechen. Und dann ist die Antwort von Eugen Rieck eine gute Antwort.
2
Ich schlage vor, Sie erwähnen BCD (Binary-Coded Decimal), das in der Elektronik üblicherweise durch 4-Bit dargestellt wird. In der Praxis beträgt die Anzahl der zur Darstellung einer Dezimalzahl verwendeten Bits in der Regel 4, hängt jedoch von der Implementierung ab.
Davidmneedham
1
@ DavidStockinger Richtig, es kommt darauf an, ob es sich um eine theoretische Frage oder eine Implementierungsfrage handelt.
Davidmneedham
2
In (10) / In (2) ist die theoretische Antwort. 4 Bits ist die wahrscheinliche Antwort auf die Implementierung.
Davidmneedham
2
@davidmneedham Nein, die meisten Zahlen sind binär gespeichert. BCD wird für seltene Spezialzwecke verwendet, aber die meisten Codierungen sind entweder Ganzzahlen oder Gleitkommazahlen. In diesen Systemen ist die Protokollantwort die richtige. Sie gibt die minimale Anzahl von Bits zum Speichern aller Zahlen einer bestimmten Dezimallänge (Aufrunden) an und erklärt, warum eine bestimmte Anzahl von Bits keine feste Anzahl von Dezimalstellen speichert.
Jack Aidley
7

BCD - Binary Coded Decimal verwendet 4 Bits pro Ziffer, genau wie Hexadezimal.

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

CWS Matt
quelle
Mit der Ausnahme, dass "BCD" häufig für die 6-Bit-Zeichencodierung verwendet wird.
Daniel R Hicks
@ DanielRHicks Ah, OK. Wikipedia sagt, dass es in den späten 1950er und frühen 1960er Jahren verwendet wurde (dh bevor EBCDIC erfunden wurde), deshalb schäme ich mich nicht, nie davon gehört zu haben. Obwohl mir jetzt klar ist, dass der Name EBCDIC davon abgeleitet wurde! Wie dem auch sei, der Begriff BCD wird immer noch nicht "oft" verwendet, um sich auf die Codierung zu beziehen, wie Sie sagen.
Herr Lister
3

Die Verwendung von Bits impliziert eine Potenz von 2, daher kann man, wie andere gesagt haben, 10 Bits nicht ohne Verschwendung in Bytes zerlegen. Eine übliche Lösung besteht darin, 4 Bits als Hexadezimalzahl zu verwenden und die 6 als AF dargestellten Zustände zu verschwenden. Das Interessante dabei ist, Dezimalzahlen zu berechnen - es ist nicht einfach und ordentlich.

Eine nützliche Unterrichtsidee könnte sein, zu vergleichen, wie Micky Mouse ein Zählsystem entwickelt hat, da er nur 4 Finger pro Hand hat - was natürlich zu einem oktalbasierten System führt.

Davidgo
quelle
Ich glaube, Sie
wollten
@ user92582 ja, ta. Korrigiert
Davidgo
Und Sie können diese "Waste" -6-Zustände verwenden, um einen Dezimalpunkt, ein Negativ, einen Sequenzterminator usw. zu codieren. Schreiben Sie einfach einen Code, um das zu tun, was wir kleinen Kindern beibringen: p
Kaithar
@kaithar - Ich glaube nicht, dass das, was Sie vorschlagen, gültig ist, da für eine dieser Operationen ein ganzes Stück oder mehr erforderlich wäre - was Ihnen nicht zur Verfügung steht.
Davidgo
1
Keine Ahnung, wo die "10 Bits" herkommen. 10 Bits = 1024 Werte. Eine Dezimalstelle hat nur 10 mögliche Werte.
MSalters
3

Dies mag eine zu starke Vereinfachung sein, hängt jedoch davon ab, welche Frage Sie stellen.
(und die Antwort ist im Grunde oktal oder hex)

Ich betrachte auch Bruchbits nicht als Bits, weil Bits im praktischen Gebrauch keine Brüche haben.

F1: Wie viele Bits können Sie in einer Dezimalstelle darstellen ?

A1: Sie können 3 Informationsbits in einer einzelnen Dezimalstelle darstellen:

Das gebräuchlichste Schema wäre Straight Binary mit Umbruch, wobei 0 = 8 = 000 und 1 = 9 = 001. Sie können jedoch jedes Schema verwenden, da nichts besagt, dass dies die einzige Möglichkeit ist, Bits in Dezimalstellen zu codieren.

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- Umhüllung (oder nicht verwendet)
  • 9: 001 <- Umhüllung (oder nicht verwendet)

oder

F2: Wie viele Bits werden benötigt, um eine Dezimalstelle darzustellen?

A2: Sie benötigen mindestens 4 Bits, um alle Dezimalstellen darzustellen. Mit etwas Abfall oder Verpackung.

Auch hier wäre das gebräuchlichste Schema ein reines Binärschema mit Umbruch, aber Sie könnten jedes andere Schema verwenden.

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 0: 1010 <- Umhüllung (oder nicht verwendet)
  • 1: 1011 <- Umhüllung (oder nicht verwendet)
  • 2: 1100 <- Umhüllung (oder nicht verwendet)
  • 3: 1101 <- Umhüllung (oder nicht verwendet)
  • 4: 1110 <- Umhüllung (oder nicht verwendet)
  • 5: 1111 <- Umhüllung (oder nicht verwendet)
Justin Ohms
quelle
2

In der Basis 1024 besteht jedes Symbol aus 10 Bits. Drei Dezimalstellen haben dieselbe Informationsmenge wie eine Stelle in der Basis 1000, was etwas weniger als 1024 ist. Daher hat eine Dezimalstelle etwas weniger als 10/3 Bits. Diese Annäherung ergibt 3.333333 ..., während die genaue Zahl 3.321928 ... ist.

Akkumulation
quelle
2
  • Hex (Basis 16) - 4 Bits
  • Oktal (Basis 8) - 3 Bits
  • Binär (Basis 2) - 1 Bit
  • Dezimal (Basis 10) - 3 1/3 Bits.
    2 10 = 1.024
    10 3 = 1.000
    2 20 = 1.048.576
    10 6 = 1.000.000
    3 Ziffern in Basis 10 bis 999 können in 10 Bits in Basis 2
    gespeichert werden . 6 Ziffern in Basis 10 bis 999.999 können in 20 Bits in Basis gespeichert werden 2.
    Dies ist die Idee, aus der Kilobyte, Megabyte und Gigabyte entstanden sind.
Russell Hankins
quelle
Tatsächlich ist es etwas weniger als 3 1/3 ... Ihre Antwort ist etwas mehrdeutig, und der Vorschlag, dass bis zu 999 Zahlen anstelle von Zahlen zwischen 0-1023 gespeichert werden können, ist etwas irreführend.
Wizzwizz4
0

Haftungsausschluss - Ich bin kein Informationstheoretiker, sondern nur ein Code-Affe, der hauptsächlich in C und C ++ (und damit bei Typen mit fester Breite) arbeitet, und meine Antwort wird aus dieser bestimmten Perspektive lauten.

Die Darstellung einer einzelnen Dezimalstelle dauert im Durchschnitt 3,2 Bit - 0 bis 7 können in 3 Bit dargestellt werden, während 8 und 9 4 erfordern. (8*3 + 2*4)/10 == 3.21 .

Dies ist weniger nützlich als es sich anhört. Zum einen haben Sie offensichtlich keine Bruchteile. Zum anderen speichern Sie, wenn Sie native Integer-Typen verwenden (dh nicht BCD oder BigInt), keine Werte als Folge von Dezimalstellen (oder deren binären Äquivalenten). Ein 8-Bit-Typ kann einige Werte mit bis zu 3 Dezimalstellen speichern, Sie können jedoch nicht alle 3-Dezimalstellen-Werte in 8 Bit darstellen - der Bereich ist [0..255]. Sie können die Werte nicht darstellen[256..999] nur in 8 Bits darstellen.

Wenn es sich um Werte handelt , verwenden wir Dezimalzahlen, wenn die Anwendung dies erwartet (z. B. eine Digital-Banking-Anwendung). Wenn es um Bits geht , verwenden wir normalerweise hexadezimal oder binär (ich verwende fast nie oktal, da ich auf Systemen arbeite, die 8-Bit-Bytes und 32-Bit-Wörter verwenden, die nicht durch 3 teilbar sind).

In Dezimalzahlen ausgedrückte Werte werden Binärsequenzen nicht sauber zugeordnet. Nehmen Sie den Dezimalwert 255. Die binären Äquivalente jeder Ziffer wäre 010, 101, 101. Die binäre Darstellung des Wertes 255ist jedoch 11111111. Es gibt einfach keine Übereinstimmung zwischen jeder der Dezimalstellen in dem Wert der binären Sequenz. Es besteht jedoch eine direkte Korrespondenz mit Hexadezimalziffern - F == 1111, sodass dieser Wert als FFHexadezimalzahl dargestellt werden kann.

Wenn Sie sich in einem System befinden, in dem 9-Bit-Bytes und 36-Bit-Wörter die Norm sind, ist Oktal sinnvoller, da Bits von Natur aus in Dreien gruppiert werden.


  1. Tatsächlich ist der Durchschnitt pro Ziffer kleiner, da 0 und 1 nur ein einziges Bit erfordern, während 2 und 3 nur 2 Bits erfordern. In der Praxis betrachten wir 0 bis 7, um 3 Bits zu erhalten. Erleichtert das Leben in vielerlei Hinsicht.

John Bode
quelle
4
So einfach ist das nicht. Zum Beispiel reicht diese 3-oder-4-Bit-Codierung nicht aus, um festzustellen, ob dies der 1001001Fall ist 91oder nicht 49.
@Hurkyl: Auch hier verwendet meine Perspektive Integer-Typen mit fester Breite - 1001001ordnet 73( 64 + 8 + 1) zu. Ich interpretiere es nicht als eine Folge von binär codierten Dezimalstellen. Wenn es soll BCD sein, die 4 Bits pro Ziffer verwenden müssen, dann müssen wir eine führende nehmen 0Bit, soll es so sein muss 49.
John Bode
2
Ich wollte nur darauf hinweisen, dass Codierungen mit variabler Länge nicht so einfach sind, wie Sie es sich vorstellen. Sie müssen feststellen, wo ein Symbol endet und ein anderes beginnt. Sie können also nicht einfach sagen, dass Sie 8 und 9 mit vier Bits darstellen können, 4-7 mit drei, 2-3 mit zwei und 0-1 mit einem. Und Sie können sehen, dass die 3.2Zahl, die Sie erhalten, tatsächlich die Informationstheorie verletzt , an die Sie gebunden sind log(10)/log(2).
@Hurkyl: Ich habe weder versucht, etwas einfacher zu machen, noch habe ich über irgendeine Art von Codierung gesprochen. Der größte Wert, der in einer 32-Bit-Ganzzahl dargestellt werden kann, ist 10 Dezimalstellen breit (3,2 Bit pro Stelle), es besteht jedoch keine Entsprechung zwischen der Binärcodierung einer der Ziffern und der Binärcodierung des Werts. Wenn Sie eine Art Binärcodierung für Dezimalstellen verwenden, muss entweder die Breite a la BCD festgelegt werden, oder Sie müssen eine Art Huffman-Codierung verwenden, die ich nicht befürworte.
John Bode
1
Das Problem bei diesem Schema ist, dass Sie das eine zusätzliche Bit vergessen haben, das Sie benötigen, um anzugeben, ob 3 oder 4 Bits folgen. Und mit einer durchschnittlichen Länge von 4,2 Bit pro Dezimalstelle ist dies noch schlimmer als bei BCD
MSalters
0

Wenn ich dies unterrichten würde, würde ich zuerst erklären, was eine Zahl (ausgedrückt als Ziffernfolge) bedeutet. dh von rechts nach links unter der Annahme der Basis n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.

Erklären Sie dann, dass 10 ^ 3 ungefähr 2 ^ 10 entspricht. Es ist nicht genau und der Grund für Computer, wir wissen oft nicht, was 2k wirklich bedeutet (sind es 2.000 oder 2.048?). Es eignet sich ziemlich gut für schnelle Annäherungen. 2 ^ 16 ist ungefähr 2 ^ (16 - 10) * 1.000 oder 2 ^ 6 (64) * 1.000 oder 64.000. In Wirklichkeit ist es 65.536, aber wenn es Ihnen nichts ausmacht, um ein Prozent zu sparen, funktioniert es ziemlich gut für schnelle Annäherungen.

Dale Chatham
quelle
Dies ist zwar eine clevere Einsicht und ein wertvoller Beitrag zum Lehrplan des OP, aber keine Antwort auf die Frage.
Scott