Cuántos bits por dígito en el sistema decimal [cerrado]


28

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) -?

77
Intuición: Digamos que lo que buscas es d, cubre un dígito decimal, el rango de 0..9. 3*dLos bits significan tres dígitos decimales y le permiten representar enteros del rango 0..999. Diez bits enteros (piense en binario ahora) dan un rango de 0..1023. 999 está bastante cerca de 1023, pero un poco menos. Por lo tanto, puede esperar dque sea un poco menos de 10/3.
Kamil Maciorowski

55
Parece que esta publicación encajaría mejor en Stack Overflow que en Super User.
gmarmstrong

21
@gmarmstrong: Yo diría que Mathematics.SE (o posiblemente SoftwareEngineering.SE). Esto no está directamente relacionado con un problema de programación.
Flater

10
@Flater: las matemáticas son definitivamente el lugar correcto, ya que esto es básicamente la teoría de la información 101.
MechMK1

77
No hay vergüenza en no saber esto, pero alguien que no lo sea podría no ser la mejor persona para enseñar sistemas numéricos.
WGroleau

Respuestas:


96

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.


Los comentarios no son para discusión extendida; Esta conversación se ha movido al chat .
DavidPostill

20

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.

  • log 2 2 = 1 (1 bit por dígito en la base 2)
  • log 2 4 = 2 (2 bits por dígito en la base 4)
  • log 2 8 = 3 (3 bits por dígito en la base 8)
  • log 2 16 = 4 (4 bits por dígito en base 16)

Los logaritmos basados ​​en K de números que no son poderes de K no son números cardinales. En particular:

  • log 2 10 = 3.321928094887362347870319429489390175864831393024580612054…

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é.


8

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í.


18
La pregunta no está equivocada. En el tema de la teoría de la información, es perfectamente normal hablar de bits de esta manera. Y luego la respuesta de Eugen Rieck es una buena respuesta.

2
Le sugiero que mencione BCD (decimal codificado en binario), que comúnmente se representa con 4 bits en electrónica. En términos prácticos, el número de bits utilizados para representar un número decimal es típicamente 4, pero depende de la implementación.
davidmneedham

1
@DavidStockinger Correcto, depende de si se trata de una pregunta teórica o de implementación.
davidmneedham

2
ln (10) / ln (2) es la respuesta teórica. 4 bits es la respuesta de implementación probable.
davidmneedham

2
@davidmneedham No, la mayoría de los números se almacenan en binario. BCD se utiliza para fines especializados poco frecuentes, pero la mayoría de las codificaciones son enteras o decimales de coma flotante. En estos sistemas, la respuesta del registro es la correcta, proporciona un número mínimo de bits para almacenar todos los números de una longitud decimal dada (redondear hacia arriba) y explica por qué un número dado de bits no almacena un número fijo de dígitos decimales.
Jack Aidley

7

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


Excepto que "BCD" se usa a menudo para referirse a la codificación de caracteres de 6 bits.
Daniel R Hicks


@DanielRHicks Ah, está bien. Wikipedia dice que se usó a fines de la década de 1950 y principios de la década de 1960 (es decir, antes de que se inventara EBCDIC), por lo que no me da vergüenza no haber oído hablar de él. ¡Aunque ahora me doy cuenta de que el nombre EBCDIC se deriva de él! De todos modos, el término BCD todavía no se "usa a menudo" para referirse a la codificación como usted dice.
Sr. Lister

3

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.


Creo que se refería a Hex en su respuesta como su Hex que tiene los valores de AF
user92592

@ user92582 sí, ta. Corregido
davidgo

Y puede usar esos 6 estados de "desperdicio" para codificar un punto decimal, negativo, terminador de secuencia, etc. En cuanto a las matemáticas decimales ... ¿no es ordenado sino simple? Simplemente escriba un código para hacer lo que enseñamos a los niños pequeños: p
Kaithar

@kaithar: no creo que lo que está proponiendo sea válido, ya que cualquiera de esas operaciones requeriría un poco o más, lo cual no tiene disponible.
davidgo

1
No hay idea de dónde se forman los "10 bits". 10 bits = 1024 valores. Un dígito decimal solo tiene 10 valores posibles.
MSalters

3

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.

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

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.

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

2

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 ...


2
  • Hex (base 16) - 4 bits
  • Octal (base 8) - 3 bits
  • Binario (base 2) - 1 bit
  • Decimal (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 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.

En realidad, es un poco menos de 3 1/3 ... Su respuesta es un poco ambigua, y la sugerencia de que se pueden almacenar números hasta 999 en lugar de números entre 0-1023 es un poco engañosa.
wizzwizz4

0

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.21 .

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ían 010, 101, 101. Sin embargo, la representación binaria del valor 255es 11111111. 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 hexadecimales F == 1111, por lo que ese valor puede representarse como FFen 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.


  1. En realidad, el promedio por dígito es menor ya que 0 y 1 solo requieren un solo bit, mientras que 2 y 3 solo requieren 2 bits. Pero, en la práctica, consideramos de 0 a 7 para tomar 3 bits. Simplemente hace la vida más fácil de muchas maneras.


44
No es tan simple; por ejemplo, esa codificación de 3 o 4 bits no es suficiente para saber si 1001001debería ser 91o 49.

@Hurkyl: de nuevo, mi perspectiva está usando tipos enteros de ancho fijo - se 1001001asigna a 73( 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 un 0bit inicial, por lo que debe ser 49.
John Bode

2
Solo estaba tratando de señalar que las codificaciones de longitud variable no son tan simples como las imaginas; necesita decir dónde termina un símbolo y comienza otro. así que no puedes decir que puedes representar 8 y 9 con cuatro bits, 4-7 con tres, 2-3 con dos y 0-1 con uno. Y puede ver que la 3.2cifra que obtiene en realidad viola la teoría de la información log(10)/log(2).

@Hurkyl: No estaba tratando de hacer nada simple, ni estaba hablando de ningún tipo de codificación. El valor más grande que se puede representar en un entero de 32 bits es de 10 dígitos decimales de ancho (3,2 bits por dígito), pero no hay correspondencia entre la codificación binaria de ninguno de los dígitos y la codificación binaria del valor. Si está utilizando algún tipo de codificación binaria para dígitos decimales, entonces el ancho debe fijarse a la BCD, o debe usar algún tipo de codificación Huffman, que no estoy recomendando.
John Bode

1
El problema con este esquema es que olvidó el bit adicional que necesita para indicar si le siguen 3 o 4 bits. Y con una longitud promedio de 4.2 bits por dígito decimal, esto es aún peor que BCD
MSalters

0

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.


Si bien esta es una visión inteligente y una valiosa contribución al plan de estudios del curso de OP, no es una respuesta a la pregunta.
Scott
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.