"¡No hay nada mejor que la codificación efectiva, Amigo! Confía en un viejo robot".

"¿Estás hablando de cifrados usados ​​por espías?"

"Por supuesto que no. Estoy hablando de presentar información en una forma digerible. Sobre sistemas numéricos. Usted sabe que en la vida cotidiana la mayoría de la gente usa el sistema decimal. Utiliza 10 símbolos para representar cada número: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Hay 10 números, así que el sistema se llama decimal".

"Eso era conveniente para los humanos con sus diez dedos. Pero los programadores son grandes inventores. Inmediatamente idearon codificaciones que usan una cantidad diferente de dígitos. Por ejemplo, 2, 8, 16 o 64 dígitos. Hicieron esto para hacerlo conveniente para las computadoras, que se basan en 'hay una señal / no hay señal'".

"Ah, ya veo lo que tienen en común... Todos estos sistemas se basan en potencias de dos.

codificación octal

"Buena observación. Comencemos con una codificación que involucra 8 dígitos. Los humanos pueden encontrar esto más fácil: simplemente suelte los números 8 y 9 y, boom, tiene la codificación octal (sistema numérico). Recientemente le hablaron sobre literales, ¿ verdad ? ?"

"Sí, lo estaba".

"Bueno, ¡sorpresa! Puedes establecer literales numéricos codificados usando el sistema octal. Si, por supuesto, realmente lo necesitas. Es más fácil de lo que parece. Simplemente coloca 0 delante del número entero.

"Entonces , si un literal numérico comienza con cero, ¿eso significa que es octal ?"

"Sí, Java lo tratará como octal.

Ejemplos:

Código notas
int x = 015; 
x es 13: 1*8+5
int x = 025; 
x es 21: 2*8+5
int x = 0123; 
x es 83: 1*64+2*8+3 == 1*8 2 +2*8 1 +3*8 0
int x = 078;
Esto no compilará: 8 no es uno de los símbolos usados ​​en la codificación octal.

"Es poco probable que necesite escribir números octales en su código, pero debe saber cuáles son. "Después de todo, tendrá que leer el código escrito por otros. Y como se mencionó anteriormente, los programadores son grandes inventores.

Bueno, recuerda que no puedes simplemente ir y escribir 0 delante de cada número".

"Pero si tengo la intención de que sea octal, ¿entonces puedo?"

"Sí.

Codificación binaria

"Incluso si aún no lo entiende, la codificación binaria es su idioma nativo. Déjame recordártelo. Si octal tiene solo los dígitos 0-7, entonces el binario solo tiene 0 y 1".

"¿Por qué es necesaria esta codificación?"

"Como mencioné anteriormente, esto tiene mucho que ver con la estructura interna de una computadora. Todo en una computadora funciona con electricidad, y resulta que la forma más eficiente de almacenar y transmitir algo usando electricidad es usar dos estados: o no hay electricidad en el cable (cero) y hay electricidad (uno)".

"Es por eso que es tan popular... ¡Hmm, parece que de hecho estoy empezando a recordar este idioma!"

"Todos los robots lo entienden perfectamente. Aunque no se usa muy a menudo en Java. Java se considera un lenguaje de alto nivel, completamente abstraído del hardware en el que se ejecuta. De hecho, ¿realmente te importa qué formato se usa para almacenar y procesar datos? dentro de una computadora?

"Pero en las últimas décadas, a los programadores les ha encantado la codificación binaria (y otras codificaciones basadas en ella). Como resultado, Java tiene operadores que toman números binarios como entradas. Y la precisión de los números de punto flotante depende de su código binario". representación.

"En resumen, es mejor que sepa sobre esta codificación que no saber".

"Correcto. Y como fue el caso con la codificación octal, Java tiene una forma de codificar literales usando el sistema binario".

"¿Entonces solo estarán compuestos de 0 y 1?"

"Exactamente. Para que el compilador de Java comprenda que el código contiene un literal numérico codificado en binario en lugar de simplemente un número decimal que consta de ceros y unos, es habitual que todos los literales binarios comiencen con el prefijo 0b (la ' b ' proviene de la palabra binario).

Ejemplos:

Código notas
int x = 0b100; 
х es 4: 1*4+0*2+0
int x = 0b1111; 
х es 15: 1*8+1*4+1*2+1
int x = 0b1111000111; 
х es 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;
Esto no compilará: 2 no es uno de los símbolos utilizados en la codificación binaria.

Codificación hexadecimal

"¿Cuánto es dos elevado a la cuarta potencia?"

"Dieciséis. ¡Descubriste la pregunta correcta para hacerle a un robot que ha llegado tan lejos como yo!"

"Te parece que has llegado lejos. De todos modos, dieciséis. Además de las codificaciones octales y binarias, los literales también se pueden escribir en hexadecimal. Esta es una codificación muy popular.

"Eso se debe a que, aunque la notación binaria es lo más parecida posible a cómo se almacenan los números, es demasiado difícil para los humanos trabajar de manera efectiva con tales números: en binario, el número un millón tiene 20 dígitos, no 7.

"Es por eso que a los programadores se les ocurrió el sistema hexadecimal. Después de todo, como notó correctamente, 16 es 2 elevado a la cuarta potencia, por lo que exactamente 4 bits corresponden a un dígito hexadecimal.

"Entonces, cada 4 bits ahora se pueden escribir en un solo dígito hexadecimal".

"Correcto. La codificación hexadecimal también tiene su propio prefijo único: 0x . Ejemplos:

Número decimal notación binaria notación 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

"Está bien, está bastante claro cómo obtuvimos el sistema octal: simplemente eliminamos los números 8 y 9. ¿Pero de dónde sacamos los 6 dígitos que faltan para el sistema hexadecimal? ¡Me gustaría verlos!"

"Todo es sencillo. Las primeras 6 letras del alfabeto inglés se tomaron como los 6 dígitos que faltan: A (10), B (11), C (12), D (13), E (14), F (15) .

Ejemplos:

notación hexadecimal notación binaria Número decimal
0x 1 0b 0000 0001 1
0x9 _ 0b 0000 1001 9
0x A 0b 0000 1010 10
0x segundo 0b 0000 1011 11
0xC _ 0b 0000 1100 12
0xD _ 0b 0000 1101 13
0x mi 0b 0000 1110 14
0xF _ 0b 0000 1111 15
0x 1F _ 0b 0001 1111 31
0x AF _ 0b 1010 1111 175
0x F F 0b 1111 1111 255
0x F F F 0b 1111 1111 1111 4095

"¿Cómo se convierte un número hexadecimal a decimal?"

"Es muy simple. Digamos que tienes el número 0 x A F C F . ¿Cuánto es eso en decimal? Primero, tenemos un sistema numérico posicional, lo que significa que la contribución de cada dígito al número total aumenta en un factor de 16 a medida que avanzamos de derecha a izquierda:

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

El símbolo A corresponde al número 10, la letra C dice que tenemos el número 12 y la letra F representa quince. Obtenemos:

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

Elevando 16 a las distintas potencias que corresponden a los dígitos, obtenemos:

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

Sumamos todo y obtenemos:

45007

"Ahora sabes cómo se almacena 45007 en la memoria".

"Sí, lo hago. Es 0x A F C F "

"Ahora vamos a convertirlo a binario. En binario sería:

0b 1010 1111 1100 1111

"Cada conjunto de cuatro bits corresponde exactamente a un carácter hexadecimal. Eso es muy conveniente. Sin ninguna multiplicación ni exponenciación".