Voy a enseñar a un pequeño grupo de personas sobre los sistemas de numeración en informática y me preguntaba cuántos bits por dígito hay en el sistema decimal, por ejemplo:
- Hex (base 16) - 4 bits
- Octal (base 8) - 3 bits
- Binario (base 2) - 1 bit
- Decimal (base 10) -?
d
, cubre un dígito decimal, el rango de0..9
.3*d
Los bits significan tres dígitos decimales y le permiten representar enteros del rango0..999
. Diez bits enteros (piense en binario ahora) dan un rango de0..1023
. 999 está bastante cerca de 1023, pero un poco menos. Por lo tanto, puede esperard
que sea un poco menos de 10/3.Respuestas:
Lo que está buscando es el logaritmo basado en 2 de 10, que es un número irracional de alrededor de 3.32192809489 ...
El hecho de que no pueda usar un número entero de bits para un dígito decimal es la causa principal de por qué muchas fracciones que son fáciles de expresar en el sistema decimal (por ejemplo, 1/5 o 0.2), son imposibles (no es difícil: realmente imposible) para expresar en binario. Esto es importante al evaluar errores de redondeo en aritmética de coma flotante.
fuente
En otras palabras, qué cantidad de información está contenida en un solo dígito en estos sistemas.
Para la base 2, la base 4, la base 8, la base 16 y otras 2 bases N , la respuesta es obvia porque en una base 2 N cada dígito se puede expresar con exactamente N dígitos.
¿Cómo se obtiene N con 2 N ? Bueno, usas un logaritmo basado en 2, que es un inverso de exponenciación.
Los logaritmos basados en K de números que no son poderes de K no son números cardinales. En particular:
Este número puede parecer confuso, pero en realidad tiene algunos usos. Por ejemplo, es una entropía de un solo dígito decimal.
Sin embargo, para su caso, no creo que este valor sea de ninguna utilidad. La respuesta de @ Christian hace un buen trabajo al explicar por qué.
fuente
Sobre el tema de los bits:
Lamento decir que la pregunta está equivocada. No usarías bits de esa manera. Un bit es un dígito binario . Puede convertir el número decimal 10 a un binario 1010 (8 + 2), por lo que necesitaría 4 bits para expresar el valor decimal 10.
Potencias de 2
Has caído en una trampa, usando binarios (2), octales (8) y hexadecimales (16) como ejemplos, porque todos estos son poderes de 2, y por lo tanto puedes pensar en ellos en términos de bits, mientras que 10 no es una potencia de 2, por lo que simplemente no funciona muy bien así.
fuente
BCD: el decimal codificado en binario usa 4 bits por dígito, lo mismo que el hexadecimal.
https://en.wikipedia.org/wiki/Binary-coded_decimal
fuente
El uso de bits implica una potencia de 2, por lo tanto, como otros han dicho, no se pueden cambiar fácilmente 10 bits en bytes sin desperdicio. Una solución común es usar 4 bits según hexadecimal y desperdiciar los 6 estados representados como AF. Lo interesante es hacer matemática decimal con esto: no es ordenado y simple.
Una idea de enseñanza útil podría ser comparar cómo Micky Mouse podría haber desarrollado un sistema de conteo, ya que solo tiene 4 dedos por mano, lo que conduce naturalmente a un sistema basado en el octal.
fuente
Esto podría ser una simplificación excesiva, pero depende de la pregunta que haga.
(y la respuesta es básicamente octal o hexadecimal)
Tampoco considero bits fraccionales como bits porque en el uso práctico los bits no tienen fracciones.
Q1: ¿Cuántos bits puedes representar en un dígito decimal ?
A1: puede representar 3 bits de información en un solo dígito decimal:
El esquema más común sería binario directo con ajuste donde 0 = 8 = 000 y 1 = 9 = 001. Pero podría usar cualquier esquema, no hay nada que diga que esta es la única forma de codificar bits en dígitos decimales.
o
P2: ¿Cuántos bits se necesitan para representar un dígito decimal?
A2: necesita al menos 4 bits para representar todos los dígitos decimales. Con algo de desperdicio o envoltura.
Nuevamente, el esquema más común sería binario directo con envoltura, pero podría usar cualquier otro esquema.
fuente
En la base 1024, cada símbolo tiene 10 bits. Tres dígitos decimales tienen la misma cantidad de información que un dígito en la base 1000, que es ligeramente menor que 1024. Por lo tanto, un dígito decimal tiene un poco menos de 10/3 bits. Esta aproximación da 3.333333 ..., mientras que el número exacto es 3.321928 ...
fuente
2 10 = 1,024
10 3 = 1,000
2 20 = 1,048,576
10 6 = 1,000,000
3 dígitos en la base 10 hasta 999 pueden mantenerse en 10 bits en la base 2.
6 dígitos en la base 10 hasta 999,999 pueden mantenerse en 20 bits en la base 2.
Esta fue la idea de kilobytes, megabytes y gigabytes originados.
fuente
Descargo de responsabilidad: no soy un teórico de la información, solo un mono de código que trabaja principalmente en C y C ++ (y, por lo tanto, con tipos de ancho fijo), y mi respuesta será desde esa perspectiva particular.
Se necesitan en promedio 3.2 bits para representar un solo dígito decimal: 0 a 7 se pueden representar en 3 bits, mientras que 8 y 9 requieren 4.
(8*3 + 2*4)/10 == 3.2
1 .Esto es menos útil de lo que parece. Por un lado, obviamente no tienes fracciones de un poco. Por otro lado, si está utilizando tipos enteros nativos (es decir, no BCD o BigInt), no está almacenando valores como una secuencia de dígitos decimales (o sus equivalentes binarios). Un tipo de 8 bits puede almacenar algunos valores que toman hasta 3 dígitos decimales, pero no puede representar todos los valores de 3 dígitos decimales en 8 bits; el rango es
[0..255]
. No puede representar los valores[256..999]
en solo 8 bits.Cuando hablamos de valores , usaremos decimal si la aplicación lo espera (por ejemplo, una aplicación de banca digital). Cuando hablamos de bits , usualmente usamos hexadecimal o binario (casi nunca uso octal ya que trabajo en sistemas que usan bytes de 8 bits y palabras de 32 bits, que no son divisibles por 3).
Los valores expresados en decimal no se asignan limpiamente a secuencias binarias. Toma el valor decimal
255
. Los equivalentes binarios de cada dígito serían010
,101
,101
. Sin embargo, la representación binaria del valor255
es11111111
. Simplemente no hay correspondencia entre ninguno de los dígitos decimales en el valor de la secuencia binaria. Pero existe una correspondencia directa con los dígitos hexadecimalesF == 1111
, por lo que ese valor puede representarse comoFF
en hexadecimal.Si está en un sistema donde los bytes de 9 bits y las palabras de 36 bits son la norma, entonces octal tiene más sentido ya que los bits se agrupan naturalmente en tres.
fuente
1001001
debería ser91
o49
.1001001
asigna a73
(64 + 8 + 1
). No lo interpreto como una secuencia de dígitos decimales codificados en binario. Si se supone que es BCD, que debe usar 4 bits por dígito, entonces debemos asumir un0
bit inicial, por lo que debe ser49
.3.2
cifra que obtiene en realidad viola la teoría de la informaciónlog(10)/log(2)
.Si estuviera enseñando esto, primero explicaría qué significa un número (expresado como una serie de dígitos). es decir, de derecha a izquierda, suponiendo la base n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.
Luego explique que 10 ^ 3 es aproximadamente igual a 2 ^ 10. No es exacto y es la razón en las computadoras, a menudo no sabemos lo que realmente significa 2k (¿es 2,000 o 2,048?) Sirve bastante bien para aproximaciones rápidas. 2 ^ 16 es aproximadamente 2 ^ (16-10) * 1,000, o 2 ^ 6 (64) * 1,000 o 64,000. En realidad, es 65,536, pero si no te importa estar cerca de un porcentaje, funciona bastante bien para aproximaciones rápidas.
fuente