Quanti bit per cifra nel sistema decimale [chiuso]


28

Ho intenzione di insegnare a un piccolo gruppo di persone i sistemi di numerazione nell'informatica e mi chiedevo quanti bit per cifra ci sono nel sistema decimale, ad esempio:

  • Esagonale (base 16) - 4 bit
  • Ottale (base 8) - 3 bit
  • Binario (base 2) - 1 bit
  • Decimale (base 10) -?

7
Intuizione: diciamo che quello che cerchi è d, copre una cifra decimale, l'intervallo di 0..9. 3*di bit indicano tre cifre decimali e consentono di rappresentare numeri interi dall'intervallo 0..999. Tutti e dieci i bit (pensa ora al binario) forniscono un intervallo di 0..1023. 999 è abbastanza vicino al 1023, ma un po 'meno. Quindi potresti aspettarti che ddovrebbe essere poco meno di 10/3.
Kamil Maciorowski,

5
Questo post sembra che si adatterebbe meglio su Stack Overflow che su Super User.
gmarmstrong,

21
@gmarmstrong: direi Mathematics.SE (o eventualmente SoftwareEngineering.SE). Questo non è direttamente correlato a un problema di programmazione.
Flater,

10
@Flater: La matematica è sicuramente il posto giusto, poiché questa è fondamentalmente la teoria dell'informazione 101.
MechMK1

7
Non c'è da vergognarsi nel non saperlo, ma uno che non potrebbe non essere la persona migliore per insegnare i sistemi di numeri.
GrGreau,

Risposte:


96

Quello che stai cercando è il logaritmo basato su 2 di 10, che è un numero irrazionale di circa 3.32192809489 ....

Il fatto che non sia possibile utilizzare un numero intero di bit per una cifra decimale è la causa principale del perché molte frazioni che sono facili da esprimere nel sistema decimale (ad esempio 1/5 o 0,2), sono impossibili (non difficile: davvero impossibile) da esprimere in binario. Questo è importante quando si valutano errori di arrotondamento nell'aritmetica in virgola mobile.


I commenti non sono per una discussione estesa; questa conversazione è stata spostata in chat .
DavidPostill

20

In altre parole, quale quantità di informazioni è contenuta in una singola cifra in questi sistemi.

Per la base 2, base 4, base 8, base 16 e altre basi 2 N la risposta è ovvia perché in una base 2 N ogni cifra può essere espressa con esattamente N cifre.

Come si ottiene N dato 2 N ? Bene, usi un logaritmo basato su 2, che è un inverso di esponenziazione.

  • log 2 2 = 1 (1 bit per cifra nella base 2)
  • log 2 4 = 2 (2 bit per cifra nella base 4)
  • log 2 8 = 3 (3 bit per cifra nella base 8)
  • log 2 16 = 4 (4 bit per cifra nella base 16)

I logaritmi basati su K di numeri che non sono poteri di K non sono numeri cardinali. In particolare:

  • log 2 10 = 3.321928094887362347870319429489390175864831393024580612054…

Questo numero può sembrare confuso, ma in realtà ha alcuni usi. Ad esempio, è un'entropia di una singola cifra decimale.

Nel tuo caso, tuttavia, non credo che questo valore sia di alcuna utilità. @La risposta di Christian fa un buon lavoro nel spiegare il perché.


8

In tema di bit:

Mi dispiace dire che la domanda è sbagliata. Non useresti bit in quel modo. Un bit è una cifra binaria . Puoi convertire il numero decimale 10, in un binario 1010 (8 + 2), quindi avresti bisogno di 4 bit per esprimere il valore decimale 10.


Poteri di 2

Sei caduto in un po 'di una trappola, usando binario (2), ottale (8) ed esadecimale (16) come esempi, perché questi sono tutti poteri di 2, e quindi puoi pensarli in termini di bit, mentre 10 non è una potenza di 2, quindi non funziona molto bene in questo modo.


18
La domanda non è sbagliata. Nell'argomento della teoria dell'informazione è perfettamente normale parlare di bit in questo modo. E poi la risposta di Eugen Rieck è una buona risposta.

2
Suggerisco di menzionare BCD (decimale con codice binario), che è comunemente rappresentato da 4 bit in elettronica. In termini pratici, il numero di bit utilizzati per rappresentare un numero decimale è in genere 4, ma dipende dall'implementazione.
davidmneedham,

1
@DavidStockinger Giusto, dipende dal fatto che si tratti di una domanda teorica o di una domanda di implementazione.
davidmneedham,

2
ln (10) / ln (2) è la risposta teorica. 4 bit è la probabile risposta all'implementazione.
davidmneedham,

2
@davidmneedham No, la maggior parte dei numeri è memorizzata in binario. BCD viene utilizzato per scopi specializzati rari, ma la maggior parte delle codifiche sono decimali in numero intero o in virgola mobile. In questi sistemi la risposta del registro è quella corretta, fornisce un numero minimo di bit per memorizzare tutti i numeri di una determinata lunghezza decimale (arrotondamento per eccesso) e spiega perché un determinato numero di bit non memorizza un numero fisso di cifre decimali.
Jack Aidley,

7

BCD - Il decimale con codice binario utilizza 4 bit per cifra, lo stesso di esadecimale.

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


Tranne il fatto che "BCD" viene spesso utilizzato per fare riferimento alla codifica dei caratteri a 6 bit.
Daniel R Hicks,


@DanielRHicks Ah, OK. Wikipedia afferma che è stato utilizzato alla fine degli anni '50 e all'inizio degli anni '60 (ovvero prima che fosse inventata EBCDIC), quindi non mi vergogno di non averne mai sentito parlare. Anche se ora mi rendo conto che il nome EBCDIC è stato derivato da esso! Ad ogni modo, il termine BCD non è ancora "spesso usato" per riferirsi alla codifica come stai dicendo.
Mr Lister,

3

L'uso dei bit implica una potenza di 2, quindi, come altri hanno detto che non si può facilmente trasferire 10 bit in byte senza sprechi. Una soluzione comune è usare 4 bit come esadecimali e sprecare i 6 stati rappresentati come AF. La cosa interessante è fare matematica decimale con questo - non è pulito e semplice.

Un'utile idea di insegnamento potrebbe essere quella di confrontare il modo in cui Micky Mouse potrebbe aver sviluppato un sistema di conteggio, poiché ha solo 4 dita per mano, il che porta naturalmente a un sistema basato sull'ottale.


Credo che tu intendessi riferirti a Hex nella tua risposta come a Hex che ha i valori AF
user92592

@ user92582 sì, ta. Corretto.
davidgo,

E puoi usare quei 6 stati "di scarto" per codificare un punto decimale, negativo, terminatore di sequenza, ecc. Per quanto riguarda la matematica decimale ... non è pulito ma semplice? Scrivi semplicemente un codice per fare ciò che insegniamo ai bambini piccoli: p
Kaithar,

@kaithar - Non credo che ciò che stai proponendo sia valido, dal momento che una qualsiasi di queste operazioni richiederebbe un bit o più - che non hai a disposizione.
davidgo,

1
Non ho idea di dove stiano arrivando i "10 bit". 10 bit = 1024 valori. Una cifra decimale ha solo 10 valori possibili.
MSalters il

3

Questa potrebbe essere una semplificazione eccessiva, ma dipende dalla domanda che stai ponendo.
(e la risposta è sostanzialmente ottale o esadecimale)

Inoltre non considero i bit frazionari come bit perché nell'uso pratico i bit non hanno frazioni.

Q1: quanti bit puoi rappresentare in una cifra decimale ?

A1: è possibile rappresentare 3 bit di informazioni in una singola cifra decimale:

Lo schema più comune sarebbe binario dritto con wrapping dove 0 = 8 = 000 e 1 = 9 = 001. Ma potresti usare qualsiasi schema, non c'è nulla che dica che questo è l'unico modo per codificare i bit in cifre decimali.

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- wrapping (o non utilizzato)
  • 9: 001 <- wrapping (o non utilizzato)

o

Q2: quanti bit sono necessari per rappresentare una cifra decimale?

A2: sono necessari almeno 4 bit per rappresentare tutte le cifre decimali. Con qualche spreco o avvolgimento.

Ancora una volta lo schema più comune sarebbe direttamente binario con il wrapping ma potresti usare qualsiasi altro schema.

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 0: 1010 <- a capo (o non utilizzato)
  • 1: 1011 <- a capo (o non utilizzato)
  • 2: 1100 <- wrapping (o non utilizzato)
  • 3: 1101 <- wrapping (o non utilizzato)
  • 4: 1110 <- wrapping (o non utilizzato)
  • 5: 1111 <- wrapping (o non utilizzato)

2

Nella base 1024, ogni simbolo è 10 bit. Tre cifre decimali hanno la stessa quantità di informazioni di una cifra nella base 1000, che è leggermente inferiore a 1024. Pertanto, una cifra decimale ha leggermente inferiore a 10/3 bit. Questa approssimazione dà 3.333333 ..., mentre il numero esatto è 3.321928 ...


2
  • Esagonale (base 16) - 4 bit
  • Ottale (base 8) - 3 bit
  • Binario (base 2) - 1 bit
  • Decimale (base 10) - 3 1/3 bit.
    2 10 = 1.024
    10 3 = 1.000
    2 20 = 1.048.576
    10 6 = 1.000.000
    3 cifre nella base 10 fino a 999 possono essere mantenute in 10 bit nella base 2.
    6 cifre nella base 10 fino a 999.999 possono essere mantenute in 20 bit nella base 2.
    È nata l'idea di kilobyte, megabyte e gigabyte.

In realtà è leggermente inferiore a 3 1/3 ... La tua risposta è un po 'ambigua e il suggerimento che è possibile memorizzare numeri fino a 999 anziché numeri tra 0-1023 è un po' fuorviante.
wizzwizz4,

0

Disclaimer - Non sono un teorico dell'informazione, solo una scimmia di codice che lavora principalmente in C e C ++ (e quindi, con tipi a larghezza fissa), e la mia risposta sarà da quella prospettiva particolare.

Sono necessari in media 3,2 bit per rappresentare una singola cifra decimale: da 0 a 7 possono essere rappresentati in 3 bit, mentre 8 e 9 richiedono 4. (8*3 + 2*4)/10 == 3.21 .

Questo è meno utile di quanto sembri. Per prima cosa, ovviamente non hai frazioni di un po '. Per un altro, se stai usando tipi interi nativi (cioè, non BCD o BigInt), non stai memorizzando valori come una sequenza di cifre decimali (o loro equivalenti binari). Un tipo a 8 bit può memorizzare alcuni valori che richiedono fino a 3 cifre decimali, ma non è possibile rappresentare tutti i valori di 3 cifre decimali in 8 bit - l'intervallo è [0..255]. Non è possibile rappresentare i valori [256..999]in soli 8 bit.

Quando parliamo di valori , utilizzeremo i decimali se l'applicazione lo prevede (ad esempio, un'applicazione di digital banking). Quando parliamo di bit , di solito usiamo hex o binary (non uso quasi mai ottale poiché lavoro su sistemi che usano byte a 8 bit e parole a 32 bit, che non sono divisibili per 3).

I valori espressi in decimale non vengono mappati in modo pulito su sequenze binarie. Prendi il valore decimale 255. Gli equivalenti binari di ogni cifra sarebbe 010, 101, 101. Tuttavia, la rappresentazione binaria del valore 255è 11111111. Semplicemente non c'è corrispondenza tra nessuna delle cifre decimali nel valore alla sequenza binaria. Ma c'è una corrispondenza diretta con cifre esadecimali F == 1111, quindi quel valore può essere rappresentato come FFin esadecimale.

Se sei su un sistema in cui i byte a 9 bit e le parole a 36 bit sono la norma, allora ottale ha più senso poiché i bit si raggruppano naturalmente in tre.


  1. In realtà, la media per cifra è inferiore poiché 0 e 1 richiedono solo un singolo bit, mentre 2 e 3 richiedono solo 2 bit. Ma, in pratica, consideriamo da 0 a 7 per prendere 3 bit. Semplifica la vita in molti modi.


4
Non è così semplice; per esempio, quella codifica a 3 o 4 bit non è sufficiente per dire se 1001001dovrebbe essere 91o 49.

@Hurkyl: ancora una volta, la mia prospettiva sta usando tipi interi a larghezza fissa - 1001001mappe a 73( 64 + 8 + 1). Non lo interpreto come una sequenza di cifre decimali con codice binario. Se si suppone che sia BCD, che deve usare 4 bit per cifra, allora dobbiamo assumere un 0bit iniziale, quindi deve essere 49.
John Bode,

2
Stavo solo cercando di sottolineare che le codifiche a lunghezza variabile non sono così semplici come le si immagina; devi dire dove finisce un simbolo e ne inizia un altro. quindi non puoi semplicemente dire che puoi rappresentare 8 e 9 con quattro bit, 4-7 con tre, 2-3 con due e 0-1 con uno. E puoi vedere che la 3.2figura che ottieni in realtà viola il limite della teoria dell'informazione log(10)/log(2).

@Hurkyl: non stavo cercando di rendere nulla semplice, né parlavo di alcun tipo di codifica. Il valore più grande che può essere rappresentato in un numero intero a 32 bit è largo 10 cifre decimali (3,2 bit per cifra), ma non esiste corrispondenza tra la codifica binaria di una qualsiasi delle cifre e la codifica binaria del valore. Se stai usando una qualche forma di codifica binaria per le cifre decimali, allora la larghezza deve essere fissata alla BCD, oppure devi usare una sorta di codifica Huffman, che non sto sostenendo.
John Bode,

1
Il problema con questo schema è che hai dimenticato un bit in più che devi indicare se seguono 3 o 4 bit. E con una lunghezza media di 4,2 bit per cifra decimale, questo è anche peggio di BCD
MSalters,

0

Se lo insegnassi, spiegherei prima cosa significa un numero (espresso come una serie di cifre). cioè, da destra a sinistra, assumendo la base n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.

Quindi spiega che 10 ^ 3 è approssimativamente uguale a 2 ^ 10. Non è esatto ed è la ragione nei computer, spesso non sappiamo cosa significhi veramente 2k (sono 2.000 o 2.048?) Serve abbastanza bene per approssimazioni rapide. 2 ^ 16 è circa 2 ^ (16 - 10) * 1.000 o 2 ^ 6 (64) * 1.000 o 64.000. In realtà, è 65.536, ma se non ti dispiace essere fuori per circa un percento, funziona abbastanza bene per approssimazioni rapide.


Sebbene si tratti di un'intuizione intelligente e di un prezioso contributo al curriculum del corso del PO, non è una risposta alla domanda.
Scott,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.