Hexadecimal - Hexadecimal

Em matemática e computação , o sistema numeral hexadecimal (também base 16 ou hex ) é um sistema numeral posicional que representa números usando uma raiz (base) de 16. Ao contrário da forma comum de representar números usando 10 símbolos, hexadecimal usa 16 símbolos distintos, na maioria das vezes os símbolos "0" - "9" para representar os valores de 0 a 9 e "A" - "F" (ou alternativamente "a" - "f") para representar os valores de 10 a 15.

Números hexadecimais são amplamente usados ​​por projetistas e programadores de sistemas de computador porque fornecem uma representação amigável de valores codificados em binários . Cada dígito hexadecimal representa quatro bits (dígitos binários), também conhecido como nibble (ou nybble), que é 1/2 de um byte . Por exemplo, um único byte pode ter valores que variam de 00000000 a 11111111 na forma binária, que pode ser convenientemente representado como 00 a FF em hexadecimal.

Em matemática, um subscrito é normalmente usado para especificar a base. Por exemplo, o valor decimal1.281 seria expresso em hexadecimal como 501 16 . Na programação, várias notações são usadas para denotar números hexadecimais, geralmente envolvendo um prefixo ou sufixo. O prefixo 0xé usado em C e linguagens de programação relacionadas, o que denotaria esse valor como 0x501.

Hexadecimal é usado na codificação de transferência Base16 , na qual cada byte do texto simples é dividido em dois valores de 4 bits e representado por dois dígitos hexadecimais.

Representação

Representação escrita

Em quase todos os usos modernos, as letras A – F ou a – f representam os valores 10–15, enquanto os numerais 0–9 são usados ​​para representar seus valores usuais.

Não existe uma convenção universal para usar letras minúsculas ou maiúsculas, então cada uma delas é predominante ou preferida em ambientes específicos por padrões ou convenções da comunidade; mesmo caso misto é freqüentemente usado. Monitores de sete segmentos usam AbCdEF de maiúsculas e minúsculas para fazer dígitos que podem ser distinguidos uns dos outros.

Há alguma padronização no uso de espaços (em vez de vírgulas ou outro sinal de pontuação) para separar valores hexadecimais em uma lista longa. Por exemplo, no seguinte hex dump, cada byte de 8 bits é um número hexadecimal de 2 dígitos, com espaços entre eles, enquanto o deslocamento de 32 bits no início é um número hexadecimal de 8 dígitos.

00000000  57 69 6b 69 70 65 64 69  61 2c 20 74 68 65 20 66  
00000010  72 65 65 20 65 6e 63 79  63 6c 6f 70 65 64 69 61  
00000020  20 74 68 61 74 20 61 6e  79 6f 6e 65 20 63 61 6e 
00000030  20 65 64 69 74 0a

Distinguir de decimal

Em contextos onde a base não é clara, os números hexadecimais podem ser ambíguos e confundidos com números expressos em outras bases. Existem várias convenções para expressar valores de forma inequívoca. Um subscrito numérico (ele próprio escrito em decimal) pode fornecer a base explicitamente: 159 10 é o decimal 159; 159 16 é hexadecimal 159, que é igual a 345 10 . Alguns autores preferem um subscrito de texto, como 159 decimal e 159 hex , ou 159 d e 159 h .

Donald Knuth introduziu o uso de uma fonte específica para representar uma raiz específica em seu livro The TeXbook . As representações hexadecimais são escritas lá em uma fonte de máquina de escrever : 5A3

Em sistemas de texto lineares, como aqueles usados ​​na maioria dos ambientes de programação de computador, uma variedade de métodos surgiu:

  • Shells Unix (e relacionados), linguagem de montagem AT&T e também a linguagem de programação C (e seus descendentes sintáticos, como C ++ , C # , Go , D , Java , JavaScript , Python e Windows PowerShell ) usam o prefixo 0xpara constantes numéricas representadas em hexadecimal: 0x5A3. As constantes de caracteres e strings podem expressar códigos de caracteres em hexadecimal com o prefixo \xseguido por dois dígitos hexadecimais: '\x1B'representa o caractere de controle Esc ; "\x1B[0m\x1B[25;1H"é uma string contendo 11 caracteres com dois caracteres Esc incorporados. Para produzir um inteiro como hexadecimal com a família de funções printf , o código de conversão de formato %Xou %xé usado.
  • Em URIs (incluindo URLs ), os códigos de caracteres são escritos como pares hexadecimais prefixados com %: http://www.example.com/name%20with%20spacesonde %20é o código para o caractere de espaço (em branco) , ponto do código ASCII 20 em hexadecimal, 32 em decimal.
  • Em XML e XHTML , os caracteres podem ser expressos como referências de caracteres numéricos hexadecimais usando a notação , por exemplo, representa o caractere U + 2019 (aspas simples à direita). Se não houver, o número é decimal (portanto, é o mesmo caractere).&#xcode;’x’
  • No padrão Unicode , um valor de caractere é representado por U+seguido do valor hexadecimal, por exemplo, U+20ACé o sinal do Euro (€).
  • As referências de cores em HTML, CSS e X Window podem ser expressas com seis dígitos hexadecimais (dois de cada para os componentes vermelho, verde e azul, nessa ordem) prefixados com #: branco, por exemplo, é representado como #FFFFFF. CSS também permite abreviações de 3 dígitos hexadecimais com um dígito hexadecimal por componente: # FA3 abrevia # FFAA33 (uma laranja dourada:  )
  • Em MIME (extensões de e-mail) codificação imprimível entre aspas , os códigos de caracteres são escritos como pares hexadecimais prefixados com =: Espa=F1aé "España" (F1 é o código para ñ no conjunto de caracteres ISO / IEC 8859-1).)
  • Em linguagens assembly derivadas da Intel e Modula-2, hexadecimal é denotado com um sufixo H ou h : FFhou 05A3H. Algumas implementações requerem um zero à esquerda quando o primeiro caractere de dígito hexadecimal não é um dígito decimal, portanto, seria necessário escrever em 0FFhvez de FFh. Algumas outras implementações (como NASM) permitem números de estilo C ( 0x42).
  • Outras linguagens assembly ( 6502 , Motorola ), Pascal , Delphi , algumas versões do BASIC ( Comodoro ), GameMaker Idioma , Godot e Forth utilizar $como um prefixo: $5A3.
  • Algumas linguagens assembly (Microchip) usam a notação H'ABCD'(para ABCD 16 ). Da mesma forma, o Fortran 95 usa Z'ABCD '.
  • Ada e VHDL incluir numerais hexadecimais na base "aspas numéricos": 16#5A3#. Para constantes de vetor de bits, o VHDL usa a notação x"5A3".
  • Verilog representa constantes hexadecimais na forma 8'hFF, onde 8 é o número de bits no valor e FF é a constante hexadecimal.
  • A linguagem Smalltalk usa o prefixo 16r:16r5A3
  • PostScript e o escudo Bourne e seus derivados designam hexagonal com prefixo 16#: 16#5A3. Para PostScript, os dados binários (como pixels de imagem ) podem ser expressos como pares hexadecimais consecutivos não fixados: AA213FD51B3801043FBC...
  • Lisp comum usa os prefixos #xe #16r. Definir as variáveis ​​* read-base * e * print-base * para 16 também pode ser usado para mudar o leitor e a impressora de um sistema Common Lisp para representação de número hexadecimal para leitura e impressão de números. Assim, os números hexadecimais podem ser representados sem o código de prefixo #x ou # 16r, quando a base de entrada ou saída foi alterada para 16.
  • MSX BASIC , QuickBASIC , FreeBASIC e Visual Basic prefixam números hexadecimais com &H:&H5A3
  • BBC BASIC e Locomotive BASIC usam &para hex.
  • TI-89 e 92 series usam um 0hprefixo:0h5A3
  • ALGOL 68 usa o prefixo 16rde números hexadecimais denotam: 16r5a3. Os números binários, quaternários (base 4) e octais podem ser especificados de forma semelhante.
  • O formato mais comum para hexadecimal em mainframes IBM ( zSeries ) e computadores de médio porte ( IBM i ) executando os sistemas operacionais tradicionais ( zOS , zVSE , zVM , TPF , IBM i ) é X'5A3'e é usado em Assembler, PL / I , COBOL , JCL , scripts, comandos e outros lugares. Esse formato também era comum em outros sistemas IBM (e agora obsoletos). Ocasionalmente, aspas eram usadas em vez de apóstrofos.
  • Qualquer endereço IPv6 pode ser escrito como oito grupos de quatro dígitos hexadecimais (às vezes chamados de hextetos ), onde cada grupo é separado por dois pontos ( :). Este, por exemplo, é um endereço IPv6 válido: 2001:0db8:85a3:0000:0000:8a2e:0370:7334ou abreviado removendo zeros como 2001:db8:85a3::8a2e:370:7334( endereços IPv4 geralmente são escritos em decimais).
  • Identificadores globais únicos são escritos como trinta e dois dígitos hexadecimais, geralmente em agrupamentos separados por hífen desiguais, por exemplo 3F2504E0-4F89-41D3-9A0C-0305E82C3301.

Outros símbolos para 10-15

O uso das letras de A a F para representar os dígitos acima de 9 não era universal no início da história dos computadores.

  • Durante a década de 1950, algumas instalações, como Bendix-14, favoreciam o uso dos dígitos de 0 a 5 com uma sobrelinha para denotar os valores 10-15 como 0 , 1 , 2 , 3 , 4 e 5 .
  • Os computadores SWAC (1950) e Bendix G-15 (1956) usaram as letras minúsculas u , v , w , x , y e z para os valores de 10 a 15.
  • O computador ILLIAC I (1952) usou as letras maiúsculas K , S , N , J , F e L para os valores de 10 a 15.
  • O Librascope LGP-30 (1956) usou as letras F , G , J , K , Q e W para os valores de 10 a 15.
  • O Honeywell Datamatic D-1000 (1957) usou as letras minúsculas b , c , d , e , f e g enquanto o Elbit  100 (1967) usou as letras maiúsculas B , C , D , E , F e G para os valores 10 a 15.
  • O Monrobot XI (1960) utilizou as letras S , T , U , V , W e X para os valores de 10 a 15.
  • O computador parametron NEC NEAC 1103 (1960) usou as letras D , G , H , J , K (e possivelmente V ) para os valores 10-15.
  • O Pacific Data Systems 1020 (1964) usou as letras L , C , A , S , M e D para os valores de 10 a 15.
  • Novos símbolos e nomes numéricos foram introduzidos na notação binária Biby por Boby Lapointe em 1968. Essa notação não se tornou muito popular.
Proposta de notação hexadecimal de Bruce Alan Martin
  • Bruce Alan Martin, do Laboratório Nacional de Brookhaven, considerou a escolha de A – F "ridícula". Em uma carta de 1968 ao editor do CACM , ele propôs um conjunto inteiramente novo de símbolos com base nas localizações dos bits, que não obteve muita aceitação.
  • Alguns chips decodificadores de display de sete segmentos (ou seja, 74LS47) mostram uma saída inesperada devido à lógica projetada apenas para produzir 0-9 corretamente.

Representações verbais e digitais

Não existem numerais tradicionais para representar as quantidades de dez a quinze - as letras são usadas como um substituto - e a maioria das línguas europeias não possui nomes não decimais para os numerais acima de dez. Embora o inglês tenha nomes para várias potências não decimais ( par para a primeira potência binária , pontuação para a primeira potência vigesimal , dúzia , bruto e grande bruto para as três primeiras potências duodecimais ), nenhum nome em inglês descreve as potências hexadecimais (decimal 16 , 256, 4096, 65536, ...). Algumas pessoas lêem números hexadecimais dígito a dígito, como um número de telefone, ou usando o alfabeto fonético da OTAN , o Alfabeto Fonético Conjunto Exército / Marinha ou um sistema ad-hoc semelhante . Na esteira da adoção do hexadecimal entre os programadores do IBM System / 360 , Magnuson (1968) sugeriu um guia de pronúncia que dava nomes curtos às letras do hexadecimal - por exemplo, "A" foi pronunciado "ann", B "aposta", C "chris", etc. Outro sistema de nomenclatura foi elaborado por Babb (2015), a partir de uma série de TV como uma piada. Ainda outro sistema de nomenclatura foi publicado online por Rogers (2007) que tenta tornar a representação verbal distinguível em qualquer caso, mesmo quando o número real não contém os números A – F. Os exemplos estão listados nas tabelas abaixo.

Esquema hexadecimal de contagem de dedos

Sistemas de contagem de dígitos foram desenvolvidos para binários e hexadecimais. Arthur C. Clarke sugeriu usar cada dedo como um bit on / off, permitindo a contagem de dedos de zero a 1023 10 em dez dedos. Outro sistema para contagem até FF 16 (255 10 ) é ilustrado à direita.


Método de nomenclatura de Magnusson (1968)
Número Pronúncia
UMA ann
B aposta
C Chris
D ponto
E Ernest
F geada
1A aniversário
A0 Annty
5B cinquenta aposta
A01C Annty Christeen
1AD0 dezesseis anos
3A7D trinta anos setenta pontos

Método de nomenclatura de Rogers (2007)
Número Pronúncia
UMA dez
B onze
C doze
D arrojo
E eptwin
F fim
10 tex
11 uma semana
1F Fimteek
50 fiftek
C0 Twelftek
100 hundrek
1000 thousek
3E Trek-Eptwin
E1 eptek-one
C4A doze hundrek-fourtek-ten
1743 um-thousek-sete--
hundrek-fourtek-três

Sinais

O sistema hexadecimal pode expressar números negativos da mesma maneira que em decimal: −2A para representar −42 10 e assim por diante.

Hexadecimal também pode ser usado para expressar os padrões de bits exatos usados ​​no processador , portanto, uma sequência de dígitos hexadecimais pode representar um valor com sinal ou até mesmo um valor de ponto flutuante . Desta forma, o número negativo −42 10 pode ser escrito como FFFF FFD6 em um registro de CPU de 32 bits (em complemento de dois ), como C228 0000 em um registro de FPU de 32 bits ou C045 0000 0000 0000 em um FPU de 64 bits registrar (no padrão de ponto flutuante IEEE ).

Notação exponencial hexadecimal

Assim como os números decimais podem ser representados em notação exponencial , os números hexadecimais também podem. Por convenção, a letra P (ou p , para "alimentação") representa vezes dois elevado à potência de , ao passo E (ou E ) serve para um propósito similar em decimal como parte da notação E . O número após o P é decimal e representa o expoente binário . Aumentar o expoente em 1 multiplica por 2, não 16. 10,0p1 = 8,0p2 = 4,0p3 = 2,0p4 = 1,0p5. Normalmente, o número é normalizado para que o dígito hexadecimal inicial seja 1 (a menos que o valor seja exatamente 0).

Exemplo: 1,3DEp42 representa 1,3DE 16  × 2 42 10 .

A notação exponencial hexadecimal é exigida pelo padrão de ponto flutuante binário IEEE 754-2008 . Esta notação pode ser usado para literais de ponto flutuante no C99 edição da linguagem de programação C . Usando os especificadores de conversão % a ou % A , essa notação pode ser produzida por implementações da família de funções printf seguindo a especificação C99 e o padrão POSIX de Especificação Unix Única (IEEE Std 1003.1) .

Conversão

Conversão binária

A maioria dos computadores manipula dados binários, mas é difícil para os humanos trabalharem com um grande número de dígitos, mesmo para um número binário relativamente pequeno. Embora a maioria dos humanos esteja familiarizada com o sistema de base 10, é muito mais fácil mapear o binário para hexadecimal do que decimal porque cada dígito hexadecimal mapeia para um número inteiro de bits (4 10 ). Este exemplo converte 1111 2 em base dez. Uma vez que cada posição em um numeral binário pode conter 1 ou 0, seu valor pode ser facilmente determinado por sua posição a partir da direita:

  • 0001 2 = 1 10
  • 0010 2 = 2 10
  • 0100 2 = 4 10
  • 1000 2 = 8 10

Portanto:

1111 2 = 8 10 + 4 10 + 2 10 + 1 10
  = 15 10

Com pouca prática, mapear 1111 2 a F 16 em uma etapa torna-se fácil: consulte a tabela na representação escrita . A vantagem de usar hexadecimal em vez de decimal aumenta rapidamente com o tamanho do número. Quando o número se torna grande, a conversão para decimal é muito tediosa. No entanto, ao mapear para hexadecimal, é trivial considerar a string binária como grupos de 4 dígitos e mapear cada um para um único dígito hexadecimal.

Este exemplo mostra a conversão de um número binário em decimal, mapeando cada dígito para o valor decimal e adicionando os resultados.

(01011110101101010010) 2 = 262144 10 + 65536 10 + 32768 10 + 16384 10 + 8192 10 + 2048 10 + 512 10 + 256 10 + 64 10 + 16 10 + 2 10
  = 387922 10

Compare isso com a conversão para hexadecimal, onde cada grupo de quatro dígitos pode ser considerado independentemente e convertido diretamente:

(01011110101101010010) 2 = 0101  1110  1011  0101  0010 2
  = 5 E B 5 2 16
  = 5EB52 16

A conversão de hexadecimal em binário é igualmente direta.

Outras conversões simples

Embora quaternário (base 4) seja pouco usado, pode ser facilmente convertido de e para hexadecimal ou binário. Cada dígito hexadecimal corresponde a um par de dígitos quaternários e cada dígito quaternário corresponde a um par de dígitos binários. No exemplo acima, 5 E B 5 2 16 = 11 32 23 11 02 4 .

O sistema octal (base 8) também pode ser convertido com relativa facilidade, embora não tão trivialmente como com as bases 2 e 4. Cada dígito octal corresponde a três dígitos binários, em vez de quatro. Portanto, podemos converter entre octal e hexadecimal por meio de uma conversão intermediária para binário seguida pelo reagrupamento dos dígitos binários em grupos de três ou quatro.

Resto da divisão na base de origem

Tal como acontece com todas as bases, existe um algoritmo simples para converter uma representação de um número em hexadecimal fazendo a divisão de inteiros e operações de resto na base de origem. Em teoria, isso é possível a partir de qualquer base, mas para a maioria dos humanos apenas decimal e para a maioria dos computadores apenas binário (que pode ser convertido por métodos muito mais eficientes) pode ser facilmente manipulado com este método.

Seja d o número a representar em hexadecimal, e a série h i h i − 1 ... h 2 h 1 sejam os dígitos hexadecimais que representam o número.

  1. eu ← 1
  2. h i ← d mod 16
  3. d ← (d - h i ) / 16
  4. Se d = 0 (retornar a série h i ), então incremente i e vá para a etapa 2

"16" pode ser substituído por qualquer outra base que possa ser desejada.

A seguir está uma implementação JavaScript do algoritmo acima para converter qualquer número em hexadecimal na representação de String. Seu objetivo é ilustrar o algoritmo acima. Para trabalhar com dados seriamente, no entanto, é muito mais aconselhável trabalhar com operadores bit a bit .

function toHex(d) {
  var r = d % 16;
  if (d - r == 0) {
    return toChar(r);
  }
  return toHex((d - r) / 16) + toChar(r);
}

function toChar(n) {
  const alpha = "0123456789ABCDEF";
  return alpha.charAt(n);
}

Conversão por adição e multiplicação

Uma tabuada hexadecimal de multiplicação

Também é possível fazer a conversão atribuindo a cada posição na base de origem a representação hexadecimal de seu valor de posição - antes de realizar a multiplicação e adição para obter a representação final. Por exemplo, para converter o número B3AD em decimal, pode-se dividir o número hexadecimal em seus dígitos: B (11 10 ), 3 (3 10 ), A (10 10 ) e D (13 10 ) e, em seguida, obter o final resulte multiplicando cada representação decimal por 16 p ( sendo p a posição do dígito hexadecimal correspondente, contando da direita para a esquerda, começando com 0). Nesse caso, temos que:

B3AD = (11 × 16 3 ) + (3 × 16 2 ) + (10 × 16 1 ) + (13 × 16 0 )

que é 45997 na base 10.

Ferramentas para conversão

A maioria dos sistemas de computador modernos com interfaces gráficas de usuário fornecem um utilitário de calculadora embutido capaz de realizar conversões entre os vários radices e, na maioria dos casos, também incluiria o hexadecimal.

No Microsoft Windows , o utilitário Calculadora pode ser configurado para o modo Científico (chamado de modo Programador em algumas versões), que permite conversões entre a raiz 16 (hexadecimal), 10 (decimal), 8 ( octal ) e 2 ( binário ), as bases mais comumente usado por programadores. No modo científico, o teclado numérico na tela inclui os dígitos hexadecimais de A a F, que ficam ativos quando "Hex" é selecionado. No modo hexadecimal, no entanto, a Calculadora do Windows oferece suporte apenas a inteiros.

Aritmética elementar

Operações elementares como adição, subtração, multiplicação e divisão podem ser realizadas indiretamente por meio da conversão para um sistema numeral alternativo , como o sistema decimal comumente usado ou o sistema binário, onde cada dígito hexadecimal corresponde a quatro dígitos binários.

Alternativamente, também se pode realizar operações elementares diretamente dentro do próprio sistema hexadecimal - contando com suas tabelas de adição / multiplicação e seus algoritmos padrão correspondentes, como divisão longa e o algoritmo de subtração tradicional.

Numeros reais

Números racionais

Tal como acontece com outros sistemas numéricos, o sistema hexadecimal pode ser usado para representar números racionais , embora expansões repetidas sejam comuns, uma vez que dezesseis (10 16 ) tem apenas um único fator primo; dois.

Para qualquer base, 0,1 (ou "1/10") é sempre equivalente a um dividido pela representação desse valor base em seu próprio sistema numérico. Assim, seja dividindo um por dois para binário ou dividindo um por dezesseis para hexadecimal, ambas as frações são escritas como 0.1. Como a raiz 16 é um quadrado perfeito (4 2 ), as frações expressas em hexadecimal têm um período ímpar com muito mais frequência do que os decimais e não há números cíclicos (exceto dígitos simples triviais). Dígitos recorrentes são exibidos quando o denominador nos termos mais baixos tem um fator primo não encontrado na raiz; portanto, ao usar a notação hexadecimal, todas as frações com denominadores que não são uma potência de dois resultam em uma sequência infinita de dígitos recorrentes (como terços e quintos). Isso torna o hexadecimal (e binário) menos conveniente do que o decimal para representar números racionais, uma vez que uma proporção maior está fora de sua faixa de representação finita.

Todos os números racionais finitamente representáveis ​​em hexadecimal também são finitamente representáveis ​​em decimal, duodecimal e sexagesimal : ou seja, qualquer número hexadecimal com um número finito de dígitos também tem um número finito de dígitos quando expresso nessas outras bases. Por outro lado, apenas uma fração daquelas finitamente representáveis ​​nas últimas bases são finitamente representáveis ​​em hexadecimal. Por exemplo, o decimal 0,1 corresponde à representação recorrente infinita 0,1 9 em hexadecimal. No entanto, hexadecimal é mais eficiente do que duodecimal e sexagesimal para representar frações com potências de dois no denominador. Por exemplo, 0,0625 10 (um décimo sexto) é equivalente a 0,1 16 , 0,09 12 e 0; 3,45 60 .

n
Fatores decimais principais de base, b = 10: 2 , 5 ; b - 1 = 9: 3 ; b + 1 = 11: 11

Fatores primos hexadecimais de base, b = 16 10 = 10: 2 ; b - 1 = 15 10 = F: 3, 5 ; b + 1 = 17 10 = 11: 11
Fração Fatores primários Representação posicional Representação posicional Fatores primários Fração (1 / n)
2 1/2 2 0,5 0,8 2 1/2
3 1/3 3 0. 3333 ... = 0. 3 0. 5555 ... = 0. 5 3 1/3
4 1/4 2 0,25 0,4 2 1/4
5 1/5 5 0,2 0. 3 5 1/5
6 1/6 2 , 3 0,1 6 0,2 A 2 , 3 1/6
7 1/7 7 0. 142857 0. 249 7 1/7
8 1/8 2 0,125 0,2 2 1/8
9 1/9 3 0. 1 0. 1C7 3 1/9
10 1/10 2 , 5 0,1 0,1 9 2 , 5 1 / A
11 1/11 11 0. 09 0. 1745D B 1 / B
12 1/12 2 , 3 0,08 3 0,1 5 2 , 3 1 / C
13 13/01 13 0. 076923 0. 13B D 1 / D
14 14/01 2 , 7 0,0 714285 0,1 249 2 , 7 1 / E
15 15/1 3 , 5 0,0 6 0. 1 3 , 5 1 / F
16 1/16 2 0,0625 0,1 2 1/10
17 1/17 17 0. 0588235294117647 0. 0F 11 1/11
18 1/18 2 , 3 0,0 5 0.0 E38 2 , 3 1/12
19 1/19 19 0. 052631578947368421 0. 0D79435E5 13 13/01
20 1/20 2 , 5 0,05 0,0 C 2 , 5 14/01
21 21/01 3 , 7 0. 047619 0. 0C3 3 , 7 15/1
22 22/01 2 , 11 0,0 45 0,0 BA2E8 2 , B 1/16
23 23/01 23 0. 0434782608695652173913 0. 0B21642C859 17 1/17
24 24/01 2 , 3 0,041 6 0,0 A 2 , 3 1/18
25 25/01 5 0,04 0. 0A3D7 5 1/19
26 26/1 2 , 13 0,0 384615 0,0 9D8 2 , D 1 / 1A
27 1/27 3 0. 037 0. 097B425ED 3 1 / 1B
28 28/01 2 , 7 0,03 571428 0,0 924 2 , 7 1 / 1C
29 29/1 29 0. 0344827586206896551724137931 0. 08D3DCB 1D 1 / 1D
30 1/30 2 , 3 , 5 0,0 3 0,0 8 2 , 3 , 5 1 / 1E
31 1/31 31 0. 032258064516129 0. 08421 1F 1 / 1F
32 1/32 2 0,03125 0,08 2 1/20
33 1/33 3 , 11 0. 03 0. 07C1F 3 , B 21/01
34 1/34 2 , 17 0,0 2941176470588235 0,0 78 2 , 11 22/01
35 1/35 5 , 7 0,0 285714 0. 075 5 , 7 23/01
36 1/36 2 , 3 0,02 7 0,0 71C 2 , 3 24/01

Números irracionais

A tabela abaixo fornece as expansões de alguns números irracionais comuns em decimais e hexadecimais.

Número Representação posicional
Decimal Hexadecimal
2 (o comprimento da diagonal de um quadrado unitário ) 1,414 213 562 373 095 048 ... 1.6A09E667F3BCD ...
3 (o comprimento da diagonal de um cubo unitário ) 1.732 050 807 568 877 293 ... 1.BB67AE8584CAA ...
5 (o comprimento da diagonal de um retângulo 1 × 2 ) 2,236 067 977 499 789 696 ... 2.3C6EF372FE95 ...
φ (phi, a proporção áurea = (1+ 5 ) / 2 ) 1.618 033 988 749 894 848 ... 1.9E3779B97F4A ...
π (pi, a razão entre a circunferência e o diâmetro de um círculo) 3,141 592 653 589 793 238 462 643
383 279 502 884 197 169 399 375 105 ...
3.243F6A8885A308D313198A2E0
3707344A4093822299F31D008 ...
e (a base do logaritmo natural ) 2.718 281 828 459 045 235 ... 2.B7E151628AED2A6B ...
τ (a constante de Thue-Morse ) 0,412 454 033 640 107 597 ... 0,6996 9669 9669 6996 ...
γ (a diferença limite entre a
série harmônica e o logaritmo natural)
0,577 215 664 901 532 860 ... 0.93C467E37DB0C7A4D1B ...

Poderes

Potências de dois têm expansões muito simples em hexadecimal. As primeiras dezesseis potências de dois são mostradas abaixo.

2 x Valor Valor (decimal)
2 0 1 1
2 1 2 2
2 2 4 4
2 3 8 8
2 4 10 hex 16 dez
2 5 20 hex 32 dez
2 6 40 hex 64 dez
2 7 80 hex 128 dez
2 8 100 hex 256 dez
2 9 200 hex 512 dez
2 A (2 10 dez ) 400 hex 1024 dez
2 B (2 11 dez ) 800 hex 2048 dez
2 C (2 12 dez ) 1000 hex 4096 dez
2 D (2 13 dez ) 2000 hex 8192 dez
2 E (2 14 dez ) 4000 hex 16.384 dez
2 F (2 15 dez ) 8000 hex 32.768 dez
2 10 (2 16 dez ) 10.000 hex 65.536 dez

História cultural

As unidades de medida tradicionais chinesas eram de base 16. Por exemplo, um jīn (斤) no sistema antigo é igual a dezesseis taéis . O suanpan ( ábaco chinês ) pode ser usado para realizar cálculos hexadecimais, como adições e subtrações.

Tal como acontece com o sistema duodecimal , tem havido tentativas ocasionais de promover o hexadecimal como o sistema numérico preferido. Essas tentativas costumam propor pronúncia e símbolos específicos para os numerais individuais. Algumas propostas unificam medidas padrão para que sejam múltiplos de 16. Uma das primeiras propostas foi apresentada por John W. Nystrom em Projeto de um novo sistema de aritmética, peso, medida e moedas: proposto a ser chamado de sistema tonal, com dezesseis to the Base , publicado em 1862. Nystrom, entre outras coisas, sugeriu o tempo hexadecimal , que subdivide um dia por 16, de modo que há 16 "horas" (ou "10 tims ", pronuncia-se tontim ) em um dia.

A palavra hexadecimal é registrado pela primeira vez em 1952. É macaronic no sentido de que ele combina grega ἕξ (hex) "seis" com Latinate -decimal . A alternativa totalmente latina sexadecimal (compare a palavra sexagesimal com a base 60) é mais antiga e tem pelo menos uso ocasional desde o final do século XIX. Ele ainda está em uso na década de 1950 na documentação do Bendix . Schwartzman (1994) argumenta que o uso de sexadecimal pode ter sido evitado por causa de sua abreviação sugestiva de sexo . Muitas línguas ocidentais desde os anos 1960 adotaram termos equivalentes na formação de hexadecimal (por exemplo francês hexadécimal , Italiano esadecimale , romeno hexazecimal , Sérvio хексадецимални , etc.), mas outros introduziram termos que substituem palavras nativas para "dezesseis" (por exemplo δεκαεξαδικός grego, islandês sextándakerfi , russo шестнадцатеричной etc.)

Terminologia e notação não foram estabelecidas até o final da década de 1960. Donald Knuth, em 1969, argumentou que o termo etimologicamente correto seria senidenário , ou possivelmente sedenário , um termo latino destinado a transmitir "agrupado por 16" modelado em binário , ternário e quaternário etc. De acordo com o argumento de Knuth, os termos corretos para decimal e octal a aritmética seria denário e octonário , respectivamente. Alfred B. Taylor usou o senidenário em seu trabalho de meados de 1800 em bases numéricas alternativas, embora tenha rejeitado a base 16 por causa de seu "número incomodativo de dígitos".

A notação agora atual usando as letras de A a F se estabelece como o padrão de fato a partir de 1966, na sequência da publicação do manual do Fortran IV para IBM System / 360 , que (ao contrário das variantes anteriores do Fortran) reconhece um padrão para inserir constantes hexadecimais. Como observado acima, notações alternativas foram usadas por NEC (1960) e The Pacific Data Systems 1020 (1964). O padrão adotado pela IBM parece ter se tornado amplamente adotado por volta de 1968, quando Bruce Alan Martin em sua carta ao editor do CACM reclama que

"Com a escolha ridícula das letras A, B, C, D, E, F como símbolos de números hexadecimais, somando-se aos já problemáticos problemas de distinguir números octais (ou hex) de números decimais (ou nomes de variáveis), o tempo está ultrapassado para reconsideração de nossos símbolos numéricos. Isso deveria ter sido feito antes que más escolhas se transformassem em um padrão de fato! "

O argumento de Martin era que o uso de números de 0 a 9 em números não-decimais "implica para nós um esquema de valores posicionais de base dez": "Por que não usar símbolos (e nomes) inteiramente novos para os sete ou quinze dígitos diferentes de zero necessários em octal ou hexadecimal . Mesmo o uso das letras de A a P seria uma melhoria, mas símbolos inteiramente novos poderiam refletir a natureza binária do sistema ".


Base16 (codificação de transferência)

Base16 (como um nome próprio sem espaço) também pode se referir a um binário para codificação de texto pertencente à mesma família de Base32 , Base58 e Base64 .

Nesse caso, os dados são divididos em sequências de 4 bits e cada valor (entre 0 e 15 inclusive) é codificado usando 16 símbolos do conjunto de caracteres ASCII . Embora quaisquer 16 símbolos do conjunto de caracteres ASCII possam ser usados, na prática, os dígitos ASCII '0' - '9' e as letras 'A' - 'F' (ou a minúscula 'a' - 'f') são sempre escolhidos para alinhar com a notação escrita padrão para números hexadecimais.

Existem várias vantagens da codificação Base16:

  • A maioria das linguagens de programação já possui recursos para analisar hexadecimal codificado em ASCII
  • Sendo exatamente meio byte, 4 bits é mais fácil de processar do que 5 ou 6 bits de Base32 e Base64, respectivamente
  • Os símbolos 0-9 e AF são universais em notação hexadecimal, por isso são facilmente compreendidos à primeira vista, sem a necessidade de contar com uma tabela de pesquisa de símbolo
  • Muitas arquiteturas de CPU têm instruções dedicadas que permitem o acesso a meio byte (também conhecido como " nibble "), tornando-o mais eficiente em hardware do que Base32 e Base64

As principais desvantagens da codificação Base16 são:

  • A eficiência de espaço é de apenas 50%, uma vez que cada valor de 4 bits dos dados originais será codificado como um byte de 8 bits. Em contraste, as codificações Base32 e Base64 têm uma eficiência de espaço de 63% e 75%, respectivamente.
  • Possível complexidade adicional de ter que aceitar letras maiúsculas e minúsculas

O suporte para codificação Base16 é onipresente na computação moderna. É a base para o padrão W3C para codificação de porcentagem de URL , onde um caractere é substituído por um sinal de porcentagem "%" e sua forma codificada em Base16. A maioria das linguagens de programação modernas incluem diretamente suporte para formatação e análise de números codificados em Base16.

Veja também

Referências