Ile bitów na cyfrę w systemie dziesiętnym [zamknięte]

28

Mam zamiar nauczyć małą grupę ludzi o systemach numeracji w komputerach i zastanawiałem się, ile bitów na cyfrę jest w systemie dziesiętnym, na przykład:

  • Szesnastkowy (podstawa 16) - 4 bity
  • Oktalowy (podstawa 8) - 3 bity
  • Binarny (baza 2) - 1 bit
  • Dziesiętny (podstawa 10) -?
użytkownik92592
źródło
7
Intuicja: Powiedzmy, że szukasz d, to obejmuje jedną cyfrę dziesiętną, zakres 0..9. 3*dbity oznaczają trzy cyfry dziesiętne i pozwalają reprezentować liczby całkowite z zakresu 0..999. Całe dziesięć bitów (teraz binarne) daje zakres 0..1023. 999 jest dość blisko 1023, ale trochę mniej. Więc możesz oczekiwać, że dpowinna być nieco mniejsza niż 10/3.
Kamil Maciorowski
5
Ten post wydaje się lepiej pasować do Przepełnienia stosu niż do Superużytkownika.
gmarmstrong
21
@gmarmstrong: Argumentowałbym Mathematics.SE (lub ewentualnie SoftwareEngineering.SE). Nie jest to bezpośrednio związane z problemem programowania.
Flater
10
@Flater: Matematyka jest zdecydowanie właściwym miejscem, ponieważ jest to w zasadzie teoria informacji 101.
MechMK1
7
Nie należy się wstydzić, że o tym nie wiemy, ale ktoś, kto nie jest najlepszą osobą do nauczania systemów liczbowych.
WGroleau,

Odpowiedzi:

96

To, czego szukasz, to logarytm oparty na liczbie 2 o wartości 10, co jest liczbą nieracjonalną wynoszącą około 3,32192809489 ....

Fakt, że nie można użyć liczby całkowitej w postaci dziesiętnej, jest główną przyczyną, dla której wiele ułamków łatwych do wyrażenia w systemie dziesiętnym (np. 1/5 lub 0,2) jest niemożliwych (nie jest to trudne: naprawdę niemożliwe) do wyrażenia binarnego. Jest to ważne przy ocenie błędów zaokrąglania w arytmetyki zmiennoprzecinkowej.

Eugen Rieck
źródło
Komentarze nie są przeznaczone do rozszerzonej dyskusji; ta rozmowa została przeniesiona do czatu .
DavidPostill
20

Innymi słowy, jaka ilość informacji jest zawarta w jednej cyfrze w tych systemach.

W przypadku podstawy 2, podstawy 4, podstawy 8, podstawy 16 i innych 2 N zasad odpowiedź jest oczywista, ponieważ w podstawie 2 N każdą cyfrę można wyrazić dokładnie N cyframi.

Jak uzyskać N, biorąc pod uwagę 2 N ? Cóż, używasz logarytmu opartego na 2, który jest odwrotnością potęgowania.

  • log 2 2 = 1 (1 bit na cyfrę w bazie 2)
  • log 2 4 = 2 (2 bity na cyfrę w bazie 4)
  • log 2 8 = 3 (3 bity na cyfrę w bazie 8)
  • log 2 16 = 4 (4 bity na cyfrę w bazie 16)

Logarytmy oparte na K na liczbach, które nie są potęgami K, nie są liczbami głównymi. W szczególności:

  • log 2 10 = 3,321928094887362347870319429489390175864831393024580612054…

Ta liczba może wydawać się myląca, ale w rzeczywistości ma pewne zastosowania. Na przykład jest to entropia pojedynczej cyfry dziesiętnej.

Jednak w twoim przypadku nie sądzę, aby ta wartość była użyteczna. @ Odpowiedź Christiana dobrze wyjaśnia, dlaczego.

gronostaj
źródło
8

Na temat bitów:

Przykro mi powiedzieć, że pytanie jest błędne. Nie użyłbyś bitów w ten sposób. Bit jest cyfrą binarną . Możesz przekonwertować liczbę dziesiętną 10 na dwójkową 1010 (8 + 2), więc potrzebujesz 4 bitów, aby wyrazić wartość dziesiętną 10.


Potęgi 2

Wpadłeś w pułapkę, używając przykładów binarnych (2), ósemkowych (8) i szesnastkowych (16) jako przykładów, ponieważ są to potęgi 2, a zatem możesz myśleć o nich w kategoriach bitów, podczas gdy 10 nie jest potęgą 2, więc po prostu nie działa tak dobrze.

chrześcijanin
źródło
18
Pytanie nie jest mylne. W temacie teorii informacji rozmawianie o bitach w ten sposób jest całkowicie normalne. A odpowiedź Eugena Riecka jest dobrą odpowiedzią.
2
Sugeruję, aby wspomnieć o BCD (dziesiętnie kodowany binarnie), który w elektronice jest powszechnie reprezentowany przez 4 bity. W praktyce liczba bitów użytych do przedstawienia liczby dziesiętnej wynosi zwykle 4, ale zależy to od implementacji.
davidmneedham
1
@DavidStockinger Racja, to zależy od tego, czy jest to pytanie teoretyczne, czy pytanie implementacyjne.
davidmneedham
2
ln (10) / ln (2) to teoretyczna odpowiedź. 4 bity to prawdopodobna odpowiedź na implementację.
davidmneedham
2
@davidmneedham Nie, większość liczb jest przechowywana w formacie binarnym. BCD jest używany do rzadkich wyspecjalizowanych celów, ale większość kodowań ma postać liczb całkowitych lub zmiennoprzecinkowych. W tych systemach odpowiedź na log jest poprawna, podaje minimalną liczbę bitów do przechowywania wszystkich liczb o określonej długości dziesiętnej (zaokrąglenie w górę) i wyjaśnia, dlaczego dana liczba bitów nie przechowuje stałej liczby cyfr dziesiętnych.
Jack Aidley
7

BCD - Binary Coded Decimal używa 4 bitów na cyfrę, tak samo jak Hexadecimal.

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

CWS Matt
źródło
Tyle że „BCD” jest często używany w odniesieniu do 6-bitowego kodowania znaków.
Daniel R Hicks,
@DanielRHicks Ah, OK. Wikipedia mówi, że był używany na przełomie lat 50. i 60. (tj. Przed wynalezieniem EBCDIC), więc nie wstydzę się, że o nim nie słyszałem. Mimo że teraz zdaję sobie sprawę, że nazwa EBCDIC pochodzi od niego! W każdym razie termin BCD nie jest wciąż „często używany” w odniesieniu do kodowania, jak to mówisz.
Pan Lister,
3

Używanie bitów oznacza potęgę 2, a zatem, jak powiedzieli inni, nie można z łatwością podzielić 10 bitów na bajty bez straty. Powszechnym rozwiązaniem jest użycie 4 bitów w systemie szesnastkowym i zmarnowanie 6 stanów przedstawionych jako AF. Interesującym elementem jest robienie z tym matematyki dziesiętnej - nie jest to schludne i proste.

Przydatnym pomysłem nauczania może być porównanie, w jaki sposób Myszka Miki opracowała system liczenia, ponieważ ma tylko 4 palce na rękę - co naturalnie prowadzi do systemu opartego na oktale.

Davidgo
źródło
Sądzę, że chciałeś odnieść się do Hex w swojej odpowiedzi jako Hex, który ma wartości AF
user92592
@ user92582 tak, ta. Poprawione
davidgo
I możesz użyć tych „marnotrawstwa” 6 stanów do zakodowania kropki dziesiętnej, ujemnej, terminatora sekwencji itp. Co do matematyki dziesiętnej ... to nie jest fajne, ale proste? Wystarczy napisać kod, aby robić to, co my uczyć małe dzieci: p
Kaithar
@kaithar - Nie uważam, że to, co proponujesz, jest prawidłowe, ponieważ każda z tych operacji wymagałaby pełnego lub więcej - które nie są dostępne.
davidgo
1
Nie ma pojęcia, skąd pochodzi „10 bitów”. 10 bitów = 1024 wartości. Cyfra dziesiętna ma tylko 10 możliwych wartości.
MSalters
3

Może to być nadmierne uproszczenie, ale zależy to od zadanego pytania.
(a odpowiedź jest w zasadzie ósemkowa lub szesnastkowa)

Nie uważam też bitów ułamkowych za bity, ponieważ w praktyce bity nie mają ułamków.

P1: Ile bitów możesz przedstawić w postaci dziesiętnej ?

A1: Możesz przedstawić 3 bity informacji za pomocą jednej cyfry dziesiętnej:

Najpopularniejszym schematem byłby prosty plik binarny z zawijaniem, gdzie 0 = 8 = 000, a 1 = 9 = 001. Ale możesz użyć dowolnego schematu, nic nie mówi, że jest to jedyny sposób kodowania bitów na cyfry dziesiętne.

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- opakowanie (lub nieużywane)
  • 9: 001 <- opakowanie (lub nieużywane)

lub

Q2: Ile bitów zajmuje cyfra dziesiętna?

A2: Potrzebujesz co najmniej 4 bitów do przedstawienia wszystkich cyfr dziesiętnych. Z niektórymi odpadami lub opakowaniami.

Ponownie najpopularniejszym schematem byłby prosty plik binarny z zawijaniem, ale można użyć dowolnego innego schematu.

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 0: 1010 <- opakowanie (lub nieużywane)
  • 1: 1011 <- opakowanie (lub nieużywane)
  • 2: 1100 <- pakowanie (lub nieużywane)
  • 3: 1101 <- opakowanie (lub nieużywane)
  • 4: 1110 <- opakowanie (lub nieużywane)
  • 5: 1111 <- opakowanie (lub nieużywane)
Justin Ohms
źródło
2

W bazie 1024 każdy symbol ma 10 bitów. Trzy cyfry dziesiętne mają taką samą ilość informacji jak jedna cyfra w bazie 1000, czyli nieco mniej niż 1024. Dlatego cyfra dziesiętna ma nieco mniej niż 10/3 bity. To przybliżenie daje 3,333333 ..., a dokładna liczba to 3,321928 ...

Akumulacja
źródło
2
  • Szesnastkowy (podstawa 16) - 4 bity
  • Oktalowy (podstawa 8) - 3 bity
  • Binarny (baza 2) - 1 bit
  • Dziesiętny (podstawa 10) - 3 1/3 bitów.
    2 10 = 1 024
    10 3 = 1 000
    2 20 = 1 048 576
    10 6 = 1 000 000
    3 cyfry w bazie 10 do 999 można przechowywać w 10 bitach w bazie 2.
    6 cyfr w bazie 10 do 999,999 można przechowywać w 20 bitach w bazie 2.
    Takie były idee kilobajtów, megabajtów i gigabajtów.
Russell Hankins
źródło
To właściwie nieco mniej niż 3 1/3 ... Twoja odpowiedź jest nieco dwuznaczna, a sugestia, że ​​można przechowywać liczby do 999 zamiast liczb między 0-1023, jest nieco myląca.
wizzwizz4
0

Zastrzeżenie - nie jestem teoretykiem informacji, tylko małpą kodu, która pracuje głównie w C i C ++ (a zatem z typami o stałej szerokości), a moja odpowiedź będzie z tej konkretnej perspektywy.

Trwa średnio 3,2 bitów reprezentuje cyfrę dziesiętną - 0 do 7, może być reprezentowana w 3 bity, natomiast 8 i 9 wymagają 4. (8*3 + 2*4)/10 == 3.21 .

Jest to mniej przydatne niż się wydaje. Po pierwsze, oczywiście nie masz ułamków. Po drugie, jeśli używasz rodzimych typów liczb całkowitych (tj. Nie BCD ani BigInt), nie przechowujesz wartości jako sekwencji cyfr dziesiętnych (lub ich binarnych odpowiedników). Typ 8-bitowy może przechowywać niektóre wartości, które zajmują do 3 cyfr dziesiętnych, ale nie można przedstawić wszystkich wartości 3-cyfrowych w 8 bitach - zakres wynosi [0..255]. Nie możesz reprezentować wartości [256..999]tylko w 8 bitach.

Kiedy mówimy o wartościach , użyjemy dziesiętnego, jeśli aplikacja tego oczekuje (np. Aplikacja bankowości cyfrowej). Kiedy mówimy o bitach , zwykle używamy szesnastkowego lub binarnego (prawie nigdy nie używam ósemkowego, ponieważ pracuję na systemach, które używają 8-bitowych bajtów i 32-bitowych słów, które nie są podzielne przez 3).

Wartości wyrażone w postaci dziesiętnej nie odwzorowują jednoznacznie sekwencji binarnych. Weź wartość dziesiętną 255. Binarne odpowiedniki każdej cyfry byłoby 010, 101, 101. Jednak binarna reprezentacja wartości 255to 11111111. Po prostu nie ma korespondencja między dowolny cyfr po przecinku w wartości do sekwencji binarnej. Ale istnieje bezpośrednia zgodność z cyframi szesnastkowymi - F == 1111tak, że wartość może być reprezentowana jak FFw systemie szesnastkowym.

Jeśli korzystasz z systemu, w którym 9-bitowe bajty i 36-bitowe słowa są normą, to ósemka ma większy sens, ponieważ bity naturalnie grupują się w trójki.


  1. W rzeczywistości średnia na cyfrę jest mniejsza, ponieważ 0 i 1 wymagają tylko jednego bitu, a 2 i 3 wymagają tylko 2 bitów. Ale w praktyce uważamy, że od 0 do 7 przyjmuje 3 bity. Po prostu ułatwia życie na wiele sposobów.

John Bode
źródło
4
To nie jest takie proste; na przykład, to 3-lub-4-bitowe kodowanie nie wystarcza, aby stwierdzić, czy 1001001należy 91lub 49.
@Hurkyl: znowu, moja perspektywa używa typów całkowitych o stałej szerokości - 1001001odwzorowuje na 73( 64 + 8 + 1). Nie interpretuję tego jako ciąg cyfr binarnych dziesiętnych. Jeśli ma to być BCD, który musi wykorzystywać 4 bity na cyfrę, to musimy założyć 0bit wiodący , więc tak musi być 49.
John Bode
2
Próbowałem tylko wskazać, że kodowanie o zmiennej długości nie jest tak proste, jak się wydaje; musisz powiedzieć, gdzie kończy się jeden symbol, a drugi zaczyna. więc nie możesz po prostu powiedzieć, że możesz reprezentować 8 i 9 za pomocą czterech bitów, 4-7 z trzema, 2-3 z dwoma i 0-1 z jednym. Widzisz, że 3.2liczba, którą otrzymujesz, jest sprzeczna z teorią informacji log(10)/log(2).
@Hurkyl: Nie próbowałem uprościć niczego, ani nie mówiłem o żadnym kodowaniu. Największa wartość, którą można przedstawić w 32-bitowej liczbie całkowitej, ma szerokość 10 cyfr dziesiętnych (3,2 bitu na cyfrę), ale nie ma żadnej zgodności między kodowaniem binarnym którejkolwiek z cyfr a kodowaniem binarnym wartości. Jeśli używasz jakiejś formy kodowania binarnego dla cyfr dziesiętnych, to albo szerokość musi być ustalona a la BCD, albo musisz użyć jakiegoś kodowania Huffmana, czego nie zalecam.
John Bode
1
Problem z tym schematem polega na tym, że zapomniałeś o jednym dodatkowym bicie, który musisz wskazać, czy następują 3 czy 4 bity. A przy średniej długości 4,2 bitów na cyfrę dziesiętną jest to nawet gorsze niż BCD
MSalters
0

Gdybym tego nauczał, najpierw wyjaśniłbym, co oznacza liczba (wyrażona jako ciąg cyfr). tzn. od prawej do lewej, przyjmując podstawę n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.

Następnie wyjaśnij, że 10 ^ 3 jest w przybliżeniu równe 2 ^ 10. To nie jest dokładne i jest przyczyną w komputerach, często nie wiemy, co tak naprawdę oznacza 2k (czy to 2000 czy 2048?) Służy dość dobrze do szybkich przybliżeń. 2 ^ 16 to około 2 ^ (16-10) * 1000 lub 2 ^ 6 (64) * 1000 lub 64 000. W rzeczywistości jest to 65 536, ale jeśli nie masz nic przeciwko byciu mniej więcej procent, działa dość dobrze w przypadku szybkich przybliżeń.

Dale Chatham
źródło
Chociaż jest to sprytny wgląd i cenny wkład w program kursu PO, nie jest to odpowiedź na pytanie.
Scott