Quantos bits por dígito no sistema decimal [fechado]


28

Vou ensinar um pequeno grupo de pessoas sobre os sistemas de numeração na computação e queria saber quantos bits por dígito existem no sistema decimal, por exemplo:

  • Hex (base 16) - 4 bits
  • Octal (base 8) - 3 bits
  • Binário (base 2) - 1 bit
  • Decimal (base 10) -?

7
Intuição: digamos que o que você procura é d, ele cobre um dígito decimal, o intervalo de 0..9. 3*dbits significam três dígitos decimais e permitem representar números inteiros do intervalo 0..999. Dez bits inteiros (pense agora em binário) fornecem um intervalo de 0..1023. 999 está bem perto de 1023, mas um pouco menos. Portanto, você deve esperar dum pouco menos que 10/3.
Kamil Maciorowski

5
Este post parece que caberia melhor no Stack Overflow do que no Superusuário.
gmarmstrong

21
@ gmarmstrong: Eu diria Mathematics.SE (ou possivelmente SoftwareEngineering.SE). Isso não está diretamente relacionado a um problema de programação.
Flater

10
@Flater: Matemática é definitivamente o lugar certo, pois esta é basicamente a teoria da informação 101.
MechMK1

7
Não há vergonha em não saber disso, mas quem não sabe pode não ser a melhor pessoa para ensinar sistemas numéricos.
WGroleau

Respostas:


96

O que você está procurando é o logaritmo baseado em 2 de 10, que é um número irracional de cerca de 3,32192809489 ....

O fato de você não poder usar um número inteiro de bits para um dígito decimal é a causa principal da razão pela qual muitas frações fáceis de expressar no sistema decimal (por exemplo, 1/5 ou 0,2) são impossíveis (não é difícil: realmente impossível) expressar em binário. Isso é importante ao avaliar erros de arredondamento na aritmética de ponto flutuante.


Comentários não são para discussão prolongada; esta conversa foi movida para o bate-papo .
DavidPostill

20

Em outras palavras, qual quantidade de informação está contida em um único dígito nesses sistemas.

Para as bases 2, base 4, base 8, base 16 e outras bases de 2 N , a resposta é óbvia porque, na base 2 N, cada dígito pode ser expresso com exatamente N dígitos.

Como você recebe N com 2 N ? Bem, você usa um logaritmo baseado em 2, que é um inverso da exponenciação.

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

Logaritmos baseados em K de números que não são potências de K não são números cardinais. Em particular:

  • log 2 10 = 3,321928094887362347870319429489390175864831393024580612054…

Esse número pode parecer confuso, mas na verdade tem alguns usos. Por exemplo, é uma entropia de um único dígito decimal.

Para o seu caso, no entanto, não acho que esse valor seja útil. A resposta de Christian faz um bom trabalho ao explicar o porquê.


8

Sobre o assunto de bits:

Lamento dizer que a pergunta está equivocada. Você não usaria bits dessa maneira. Um bit é um dígito binário . Você pode converter o número decimal 10 em um 1010 binário (8 + 2), portanto precisará de 4 bits para expressar o valor decimal 10.


Poderes de 2

Você caiu em uma armadilha, usando binário (2), octal (8) e hexadecimal (16) como exemplos, porque esses são todos os poderes de 2 e, portanto, você pode pensar neles em termos de bits, enquanto 10 não é uma potência de 2, então simplesmente não funciona muito bem assim.


18
A questão não é equivocada. No assunto da teoria da informação, é perfeitamente normal falar sobre bits dessa maneira. E então a resposta de Eugen Rieck é uma boa resposta.

2
Sugiro que você mencione BCD (decimal com código binário), que geralmente é representado por 4 bits na eletrônica. Em termos práticos, o número de bits usados ​​para representar um número decimal é tipicamente 4, mas depende da implementação.
davidmneedham

1
@DavidStockinger Certo, depende se é uma questão teórica ou de implementação.
Davidmneedham 28/11

2
ln (10) / ln (2) é a resposta teórica. 4 bits é a resposta de implementação provável.
Davidmneedham 28/11

2
@davidmneedham Não, a maioria dos números é armazenada em binário. O BCD é usado para finalidades especializadas raras, mas a maioria das codificações é de número inteiro ou decimal de ponto flutuante. Nesses sistemas, a resposta do log é a correta, fornece um número mínimo de bits para armazenar todos os números de um determinado comprimento decimal (arredondado para cima) e explica por que um determinado número de bits não armazena um número fixo de dígitos decimais.
Jack Aidley

7

BCD - Decimal codificado em binário usa 4 bits por dígito, o mesmo que Hexadecimal.

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


Exceto que "BCD" é frequentemente usado para se referir à codificação de caracteres de 6 bits.
Daniel R Hicks


@DanielRHicks Ah, OK. A Wikipedia diz que foi usada no final da década de 1950 e no início da década de 1960 (ou seja, antes da invenção do EBCDIC), então não tenho vergonha de nunca ter ouvido falar disso. Mesmo sabendo agora que o nome EBCDIC foi derivado dele! De qualquer forma, o termo BCD ainda não é "frequentemente usado" para se referir à codificação como você está dizendo.
Sr. Lister

3

O uso de bits implica uma potência de 2, portanto, como outros disseram que você não pode facilmente converter 10 bits em bytes sem desperdício. Uma solução comum é usar 4 bits por hexadecimal e desperdiçar os 6 estados representados como AF. O interessante é fazer matemática decimal com isso - não é puro e simples.

Uma idéia útil para o ensino pode ser comparar como Micky Mouse pode ter desenvolvido um sistema de contagem, pois ele tem apenas 4 dedos por mão - o que leva naturalmente a um sistema octal.


Eu acredito que você pretende referir-Hex em sua resposta como seu Hex que tem os valores de FA
user92592

@ user92582 sim, ta. Corrigido.
Davidgo 28/11

E você pode usar esses 6 estados "desperdiçados" para codificar um ponto decimal, negativo, terminador de sequência, etc. Quanto à matemática decimal ... não é puro, mas simples? Basta escrever um código para fazer o que ensinamos às crianças pequenas: p
Kaithar 28/11

@kaithar - Não acredito que o que você está propondo seja válido, pois qualquer uma dessas operações exigiria um bit inteiro ou mais - o que você não tem disponível.
Davidgo 28/11

1
Não faz ideia de onde os "10 bits" estão chegando. 10 bits = 1024 valores. Um dígito decimal possui apenas 10 valores possíveis.
MSalters

3

Isso pode ser uma simplificação excessiva, mas depende de qual pergunta você está fazendo.
(e a resposta é basicamente octal ou hexadecimal)

Também não considero bits fracionários como bits porque, na prática, os bits não têm frações.

Q1: quantos bits você pode representar em um dígito decimal ?

A1: você pode representar 3 bits de informação em um único dígito decimal:

O esquema mais comum seria o binário direto com quebra automática em que 0 = 8 = 000 e 1 = 9 = 001. Mas você pode usar qualquer esquema, pois nada indica que essa é a única maneira de codificar bits em dígitos decimais.

  • 0: 000
  • 1: 001
  • 2: 010
  • 3: 011
  • 4: 100
  • 5: 101
  • 6: 110
  • 7: 111
  • 8: 000 <- embalagem (ou não utilizada)
  • 9: 001 <- quebra automática (ou não utilizada)

ou

P2: Quantos bits são necessários para representar um dígito decimal?

A2: Você precisa de pelo menos 4 bits para representar todos os dígitos decimais. Com algum desperdício ou embalagem.

Novamente, o esquema mais comum seria o binário direto com quebra automática, mas você poderia usar qualquer outro esquema.

  • 0: 0000
  • 1: 0001
  • 2: 0010
  • 3: 0011
  • 4: 0100
  • 5: 0101
  • 6: 0110
  • 7: 0111
  • 8: 1000
  • 9: 1001
  • 0: 1010 <- quebra automática (ou não utilizada)
  • 1: 1011 <- quebra automática (ou não utilizada)
  • 2: 1100 <- quebra automática (ou não utilizada)
  • 3: 1101 <- embalagem (ou não utilizada)
  • 4: 1110 <- embalagem (ou não utilizada)
  • 5: 1111 <- quebra automática (ou não utilizada)

2

Na base 1024, cada símbolo tem 10 bits. Três dígitos decimais têm a mesma quantidade de informações que um dígito na base 1000, que é um pouco menor que 1024. Portanto, um dígito decimal tem um pouco menos que 10/3 bits. Essa aproximação fornece 3,3333333 ..., enquanto o número exato é 3,321928 ...


2
  • Hex (base 16) - 4 bits
  • Octal (base 8) - 3 bits
  • Binário (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 na base 10 até 999 podem ser mantidos em 10 bits na base 2.
    6 dígitos na base 10 até 999.999 podem ser mantidos em 20 bits na base 2.
    Essa é a idéia de kilobytes, megabytes e gigabytes originados.

Na verdade, é um pouco menos que 3 1/3 ... Sua resposta é um pouco ambígua, e a sugestão de que números até 999 podem ser armazenados em vez de números entre 0 e 1023 é um pouco enganadora.
wizzwizz4

0

Isenção de responsabilidade - eu não sou um teórico da informação, apenas um macaco de código que trabalha principalmente em C e C ++ (e, portanto, com tipos de largura fixa), e minha resposta será dessa perspectiva específica.

São necessários em média 3,2 bits para representar um único dígito decimal - 0 a 7 pode ser representado em 3 bits, enquanto 8 e 9 exigem 4. (8*3 + 2*4)/10 == 3.21 .

Isso é menos útil do que parece. Por um lado, você obviamente não tem frações nem um pouco. Por outro lado, se você estiver usando tipos inteiros nativos (por exemplo, não BCD ou BigInt), não estará armazenando valores como uma sequência de dígitos decimais (ou seus equivalentes binários). Um tipo de 8 bits pode armazenar alguns valores com até 3 dígitos decimais, mas você não pode representar todos os valores de 3 dígitos decimais em 8 bits - o intervalo é [0..255]. Você não pode representar os valores [256..999]em apenas 8 bits.

Quando falamos de valores , usaremos decimal se o aplicativo esperar (por exemplo, um aplicativo bancário digital). Quando falamos de bits , geralmente usamos hexadecimal ou binário (quase nunca uso octal, pois trabalho em sistemas que usam bytes de 8 bits e palavras de 32 bits, que não são divisíveis por 3).

Os valores expressos em decimal não são mapeados corretamente para seqüências binárias. Tome o valor decimal 255. Os equivalentes binários de cada dígito seria 010, 101, 101. No entanto, a representação binária do valor 255é 11111111. Simplesmente não há correspondência entre nenhum dígito decimal no valor da sequência binária. Mas há uma correspondência direta com dígitos hexadecimais - F == 1111, para que o valor possa ser representado como FFem hexadecimal.

Se você estiver em um sistema em que bytes de 9 bits e palavras de 36 bits são a norma, então octal faz mais sentido, já que os bits agrupam-se naturalmente em três.


  1. Na verdade, a média por dígito é menor, pois 0 e 1 requerem apenas um bit, enquanto 2 e 3 exigem apenas 2 bits. Mas, na prática, consideramos 0 a 7 para levar 3 bits. Apenas facilita a vida de várias maneiras.


4
Não é tão simples assim; por exemplo, essa codificação de 3 ou 4 bits não é suficiente para dizer se 1001001deve ser 91ou 49.

@Hurkyl: novamente, minha perspectiva está usando tipos inteiros de largura fixa - 1001001mapeia para 73( 64 + 8 + 1). Não o interpreto como uma sequência de dígitos decimais codificados em binários. Se deveria ser BCD, que deve usar 4 bits por dígito, devemos assumir um 0bit inicial, assim deve ser 49.
John Bode

2
Eu estava apenas tentando salientar que as codificações de comprimento variável não são tão simples quanto você imagina; você precisa dizer onde um símbolo termina e outro começa. então você não pode simplesmente dizer que pode representar 8 e 9 com quatro bits, 4-7 com três, 2-3 com dois e 0-1 com um. E você pode ver que a 3.2figura que você obtém realmente viola a teoria da informação log(10)/log(2).

@Hurkyl: Eu não estava tentando simplificar nada, nem estava falando sobre qualquer tipo de codificação. O maior valor que pode ser representado em um número inteiro de 32 bits tem 10 dígitos decimais (3,2 bits por dígito), mas não há correspondência entre a codificação binária de qualquer um dos dígitos e a codificação binária do valor. Se você estiver usando alguma forma de codificação binária para dígitos decimais, a largura deve ser corrigida à la BCD ou você deve usar algum tipo de codificação de Huffman, que não estou defendendo.
John Bode

1
O problema com esse esquema é que você esqueceu o bit extra necessário para indicar se os 3 ou 4 bits seguem. E com um comprimento médio de 4,2 bits por dígito decimal, isso é ainda pior que o BCD
MSalters

0

Se eu estivesse ensinando isso, explicaria primeiro o que significa um número (expresso como uma série de dígitos). ou seja, da direita para a esquerda, assumindo a base n, a * n ^ 0 + b * n ^ 1 + c * n ^ 2 ... z * n ^ y.

Explique então que 10 ^ 3 é aproximadamente igual a 2 ^ 10. Não é exato e é o motivo dos computadores; geralmente não sabemos o que 2k realmente significa (são 2.000 ou 2.048?) Serve razoavelmente bem para aproximações rápidas. 2 ^ 16 é de cerca de 2 ^ (16 - 10) * 1.000, ou 2 ^ 6 (64) * 1.000 ou 64.000. Na realidade, é 65.536, mas se você não se importa em ficar em torno de um por cento, funciona bastante bem para aproximações rápidas.


Embora esse seja um insight inteligente e uma contribuição valiosa para o currículo do curso do OP, não é uma resposta para a pergunta.
30317 Scott
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.