"Não há nada melhor do que uma codificação eficaz, amigo! Confie em um robô antigo."

"Você está falando sobre cifras usadas por espiões?"

"Claro que não. Estou falando de apresentar informações de forma digerível. Sobre sistemas numéricos. Você sabe que na vida cotidiana a maioria das pessoas usa o sistema decimal. Ele usa 10 símbolos para representar cada número: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. São 10 numerais, então o sistema é chamado de decimal."

"Isso era conveniente para os humanos com seus dez dedos. Mas os programadores são grandes inventores. Eles imediatamente criaram codificações que usam um número diferente de dígitos. Por exemplo, 2, 8, 16 ou 64 dígitos. Eles fizeram isso para torná-lo conveniente para computadores, que dependem de 'há um sinal / não há sinal'."

"Ah, vejo o que eles têm em comum... Todos esses sistemas são baseados em potências de dois.

Codificação octal

"Boa observação. Vamos começar com uma codificação que envolve 8 dígitos. Os humanos podem achar isso o mais fácil: basta descartar os números 8 e 9 e - boom - você tem a codificação octal (sistema de numeração). Recentemente, você foi informado sobre literais , certo ?"

"Sim, eu estava."

"Bem, surpresa! Você pode definir literais numéricos codificados usando o sistema octal. Se, é claro, você realmente precisar. É mais fácil do que parece. Basta colocar 0 na frente do número inteiro.

"Então , se um literal numérico começa com zero, isso significa que é octal ?"

"Sim, Java irá tratá-lo como octal.

Exemplos:

Código Notas
int x = 015; 
x é 13: 1*8+5
int x = 025; 
x é 21: 2*8+5
int x = 0123; 
x é 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Isso não compilará: 8 não é um dos símbolos usados ​​na codificação octal.

"É improvável que você precise escrever números octais em seu código, mas você deve saber o que são. "Afinal, você terá que ler o código escrito por outras pessoas. E como mencionado acima, os programadores são grandes inventores.

Bem, lembre-se de que você não pode simplesmente escrever 0 na frente de cada número."

"Mas se eu pretendo que seja octal, então posso?"

"Sim.

Codificação binária

"Mesmo que você ainda não entenda, a codificação binária é o seu idioma nativo. Deixe-me lembrá-lo disso. Se o octal tiver apenas os dígitos 0-7, o binário terá apenas 0 e 1."

"Por que essa codificação é necessária?"

"Como mencionei acima, isso tem tudo a ver com a estrutura interna de um computador. Tudo em um computador funciona com eletricidade e, por acaso, a maneira mais eficiente de armazenar e transmitir algo usando eletricidade é usar dois estados: ou não há eletricidade no fio (zero) e há eletricidade (um)."

"É por isso que é tão popular... Hmm, parece que estou mesmo começando a me lembrar dessa língua!"

"Todos os robôs entendem perfeitamente. Embora não seja usado com muita frequência em Java. Java é considerada uma linguagem de alto nível, completamente abstraída do hardware em que é executada. Na verdade, você realmente se importa com o formato usado para armazenar e processar dados dentro de um computador?

"Mas, nas últimas décadas, os programadores passaram a amar a codificação binária (e outras codificações baseadas nela). Como resultado, Java tem operadores que aceitam números binários como entradas. representação.

"Em resumo, é melhor você saber sobre essa codificação do que não saber."

"Certo. E como foi o caso da codificação octal, Java tem uma maneira de codificar literais usando o sistema binário."

"Então eles serão compostos apenas de 0s e 1s?"

"Exatamente. Para que o compilador Java entenda que o código contém um literal numérico codificado em binário em vez de simplesmente um número decimal consistindo de zeros e uns, é comum que todos os literais binários comecem com o prefixo 0b (o ' b ' vem da palavra binário).

Exemplos:

Código Notas
int x = 0b100; 
х é 4: 1*4+0*2+0
int x = 0b1111; 
х é 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х é 967: 1*2 9 +1*2 8 +1*2 7 +1*2 6 +0*2 5 +0*2 4 +0*2 3 +1 *2 2 + 1*2+1;
int x = 0b12000;
Isso não compilará: 2 não é um dos símbolos usados ​​na codificação binária.

Codificação hexadecimal

"Quanto é dois elevado a quarta potência?"

"Dezesseis. Você descobriu a pergunta certa para fazer a um robô que chegou até mim!"

"Parece que você chegou longe. Enfim, dezesseis. Além das codificações octal e binária, os literais também podem ser escritos em hexadecimal. Esta é uma codificação muito popular.

“Isso ocorre porque, embora a notação binária seja o mais próximo possível de como os números são realmente armazenados, é muito difícil para os humanos trabalhar efetivamente com esses números: em binário, o número um milhão de 20 dígitos, não 7.

"É por isso que os programadores criaram o sistema hexadecimal. Afinal, como você observou corretamente, 16 é 2 elevado à 4ª potência, então exatamente 4 bits correspondem a um dígito hexadecimal.

"Portanto, cada 4 bits agora pode ser escrito em um único dígito hexadecimal."

"Certo. A codificação hexadecimal também tem seu próprio prefixo exclusivo: 0x . Exemplos:

Número decimal Notação binária notação hexadecimal
17 0b 0001 0001 0x 1 1
4 1 0b 0010 1 00 1 0x 2 9
85 0b 0101 0101 0x 5 5
256 0b 1 0000 0000 0x 1 0 0

"Ok, está claro como chegamos ao sistema octal: apenas jogamos fora os números 8 e 9. Mas de onde tiramos os 6 dígitos que faltam para o sistema hexadecimal? Eu gostaria de vê-los!"

"É tudo simples. As primeiras 6 letras do alfabeto inglês foram tomadas como os 6 dígitos que faltam: A (10), B (11), C (12), D (13), E (14), F (15) .

Exemplos:

notação hexadecimal Notação binária Número decimal
0x1 _ 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0x A 0b 0000 1010 10
0x b 0b 0000 1011 11
0x C 0b 0000 1100 12
0x D 0b 0000 1101 13
0x E 0b 0000 1110 14
0x F 0b 0000 1111 15
0x1F _ _ 0b 0001 1111 31
0x A F 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095

"Como você converte um número hexadecimal em decimal?"

"É muito simples. Digamos que você tenha o número 0 x A F C F . Quanto é isso em decimal? Primeiro, temos um sistema numérico posicional, o que significa que a contribuição de cada dígito para o número geral aumenta por um fator de 16 conforme nos movemos da direita para a esquerda:

A * 16 3 + F * 16 2 + C * 16 1 + F

O símbolo A corresponde ao número 10, a letra C diz que temos o número 12 e a letra F representa quinze. Nós temos:

10 * 16 3 + 15 * 16 2 + 12 * 16 1 + 15

Elevando 16 às várias potências que correspondem aos dígitos, obtemos:

10 * 4096 + 15 * 256 + 12 * 16 + 15

Somamos tudo e obtemos:

45007

"Agora você sabe como 45007 é armazenado na memória."

"Sim, eu tenho. É 0x A F C F "

"Agora vamos convertê-lo para binário. Em binário seria:

0b 1010 1111 1100 1111

"Cada conjunto de quatro bits corresponde a exatamente um caractere hexadecimal. Isso é super conveniente. Sem qualquer multiplicação ou exponenciação."