O que é o sistema hexadecimal?
Se você tiver um número abcd, então isso é equivalente a ((a * + b) + c) + d. Então é assim:
- abcd (binário) = ((a * 2 + b) * 2 + c) * 2 + d
- abcd (octal) = ((a * 8 + b) * 8 + c) * 8 + d
- abcd (decimal) = ((a * 10 + b) * 10 + c) * 10 + d
- abcd (hexadecimal) = ((a * 16 + b) * 16 + c) * 16 + d
Em um sistema hexadecimal você precisa de 16 dígitos, mas temos apenas dez dígitos disponíveis (0..9). Então, para os 6 dígitos ausentes, os caracteres A..F são usados com A = 10, ..., F = 15.
É claro que você também pode pensar em muitos outros sistemas numéricos, por exemplo, com base de 5 ou 7.
Para cálculo com números, não importa qual base você está usando. Você pode adicionar e multiplicar no sistema binário, você pode fazê-lo no sistema decimal e você pode fazê-lo no sistema hexadecimal. Estamos acostumados a calcular no sistema decimal, os computadores fazem isso no sistema binário.
Por que o sistema hexadecimal é tão usado na computação?
Como dito acima, não importa em qual sistema numérico você forneça um número. O número subjacente é o mesmo, apenas a representação é alterada. O computador sempre armazenará e usará internamente (por exemplo, calcular com) números em binário.
Então, por que os programadores (como eu) usam sistemas numéricos diferentes? Existem duas razões para escolher um sistema numérico baseado em uma potência de 2. A primeira é a falta e a segunda é uma boa visão de quais bits são definidos.
Falta
Se eu tenho uma função que está escrevendo o conteúdo de um buffer para o console, então eu poderia escrever o código que é impresso em decimal, que é de 1 a 3 dígitos (decimal: 0.255). Se eu estou escrevendo o número em formato binário, eu acabaria com uma saída de 1 a 8 dígitos (binário: 0.11111111). Eu também poderia usar o sistema octal e acabar com 1 a 3 dígitos (octal: 0..377) ou hexadecimal com 1 a 2 dígitos (hexadecimal: 0..ff).
Isto foi apenas para um byte. Vamos supor agora que você quer escrever um número de 32 bits:
- binário: 0.11111111111111111111111111111111
- octal: 0..37777777777
- decimal: 4294967295
- hexadecimal: 0..ffffffff
Como você pode ver, a saída hexadecimal é a mais curta.
Vendo os bits
Um padrão comum para armazenar informações compactadas é usar cada bit em um byte individualmente. Vamos pegar, por exemplo, atributos de arquivo (consulte MDSN ). Você quer os atributos "hidden", "archive", "readonly", "temporary" e outros. Você pode armazenar cada atributo em um byte ou pode compactar as informações em um byte (ou vários bytes), onde cada bit representa exatamente um atributo. Se você observar o dwFlagsAndAttributes no artigo do MSDN, poderá ver que o Windows está usando esse padrão.
Permanecendo na página do MSDN, vamos usar FILE_ATTRIBUTE_ENCRYPTED
como exemplo, esse sinalizador é decimal 16384 e hexadecimal 0x4000. O "0x" líder é apenas uma convenção do programador C para marcar números hexadecimais, então vamos apenas olhar para 4000. Quando você quiser saber quais bits estão configurados, então você precisará converter 16384 para binário primeiro - nada que você possa normalmente faz com aritmética mental. Mas vamos pegar o hexadecimal de 4000. Isso é bem fácil. 16 é 2 * 4, portanto, cada número hexadecimal é exatamente 4 bits. Por isso, convertemos apenas 4 em binário 0100 e os zeros em binário 0000 e estamos prontos.
Muitas vezes não se trata de bits individuais, mas os programadores tendem a alinhar as coisas com potências de 2. Gostamos de carregar programas não para um endereço aleatório, mas para um endereço com os 16 bits menos significativos definidos como zero. Dessa forma, se você tiver um endereço 0x12345678, poderá ver facilmente que esse endereço pertence ao programa carregado em 0x1234 e não ao carregado em 0x03810000.
Prefere binário, octal ou hexadecimal?
Essa é uma questão de sabor. Se você quiser ver diretamente os bits, o binário pode ficar bem. Para números longos, o binário pode ser frustrante se você tiver que contar os dígitos para ver se o bit 23 ou 24 está definido. Isso é mais fácil com o hexadecimal porque cada dígito representa 4 bits, então você tem menos contagem envolvida. Pessoalmente eu raramente uso octal. É muito incomum.
Mas por que não usar a base 32?
Base 32 é uma potência de 2, isso é ótimo. Mas você precisaria de 32 dígitos como 0..9, A..V. Isto é muito mais dígitos para lembrar (você consegue identificar facilmente qual número 'S' responderia?). Outra ressalva é que com a base 32 você perde o bom recurso de que dois dígitos hexadecimais são exatamente um byte, o que é muito útil se você der uma olhada no conteúdo da memória! Também com a base 32 você ainda precisa de 2 dígitos para representar os valores que um byte pode ter. Para um valor de 32 bits, você precisa apenas de 7 dígitos em vez de 8 dígitos hexadecimais, mas isso não é muito para conviver com as desvantagens do sistema base 32.