1. Codificação octal

Falando em codificações... Como você sabe, na vida cotidiana usamos a notação decimal : todos os nossos números são representados por 10 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Existem 10 numerais, então o sistema é chamado de decimal.

Mas os programadores são grandes inventores. Eles imediatamente criaram codificações que usam um número diferente de símbolos. Por exemplo, 16, 8 e 2.

A codificação alternativa que usa 8 símbolos é a mais fácil: basta eliminar o 8 e o 9 e obter uma codificação octal (o sistema de numeração octal ).

E, sim, você pode usar o sistema octal para especificar literais numéricos. Se, claro, você realmente precisar. É mais fácil do que parece. Você só precisa escrever o número 0 antes do número.

Em outras palavras, Java trata qualquer literal inteiro começando com 0 como um valor 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 irá 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.



2. Codificação binária

A codificação binária é ainda mais interessante. Se o octal tiver apenas os dígitos de 0 a 7, o binário terá apenas 0 e 1. Por que essa codificação é necessária?

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

Esta é a origem da popularidade do sistema numérico binário.

Em princípio, não é 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 possui operadores que recebem números binários como entradas. E a precisão dos números de ponto flutuante depende de sua representação binária.

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

E como foi o caso da codificação octal, Java tem uma maneira de codificar literais usando o sistema binário. Ou seja, literais compostos apenas por 0s e 1s. 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 que consiste em zeros e uns, todos os literais binários são identificados usando 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.


3. Codificação hexadecimal

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 contém 20 dígitos, não 7.

É por isso que os programadores criaram o sistema hexadecimal. Afinal, 16 é 2 elevado à potência, então exatamente 4 bits correspondem a um dígito hexadecimal. Grosso modo, cada 4 bits agora pode ser escrito como um único dígito hexadecimal.

A codificação hexadecimal também possui 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, você diz, está claro como chegamos ao sistema octal: apenas jogamos fora os números 8 e 9, mas onde conseguimos os 6 símbolos extras para o sistema hexadecimal? Eu gostaria de vê-los!

É tudo simples. As primeiras 6 letras do alfabeto inglês foram tomadas como os 6 símbolos 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
0xB _ 0b 0000 1011 11
0x C 0b 0000 1100 12
0x D 0b 0000 1101 13
0x E 0b 0000 1110 14
0xF _ 0b 0000 1111 15
0x1 F _ 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


4. Como converter um número de hexadecimal

Converter um número de hexadecimal para decimal é muito fácil. 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 total aumenta em um fator de 16 à medida que 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 corresponde ao 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

Você sabe como esse número é armazenado na memória:

0x A F C F

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