1. Codificación octal

Hablando de codificaciones... Como sabes, en la vida cotidiana usamos la notación decimal : todos nuestros números se representan usando 10 símbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9. Hay 10 números, por lo que el sistema se llama decimal.

Pero los programadores son grandes inventores. Inmediatamente se les ocurrieron codificaciones que usan una cantidad diferente de símbolos. Por ejemplo, 16, 8 y 2.

La codificación alternativa que usa 8 símbolos es la más fácil: simplemente suelte el 8 y el 9 y obtendrá una codificación octal (el sistema de numeración octal ).

Y sí, puede usar el sistema octal para especificar literales numéricos. Si, por supuesto, realmente lo necesitas. Es más fácil de lo que parece. Solo necesita escribir el número 0 antes del número.

En otras palabras, Java trata cualquier literal entero que comience con 0 como un valor 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ás que leer el código escrito por otros. Y como se mencionó anteriormente, los programadores son grandes inventores.

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



2. Codificación binaria

La codificación binaria es aún más interesante. Si octal tiene solo los dígitos 0-7, entonces binario tiene solo 0 y 1. ¿Por qué es necesaria esta codificación?

Esto tiene todo 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).

Este es el origen de la popularidad del sistema numérico binario.

En principio, 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 le importa qué formato se utiliza para almacenar y procesar datos dentro de una computadora?

Pero en las últimas décadas, los programadores han llegado a amar 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 coma flotante depende de su representación binaria.

Básicamente, es mejor para usted saber acerca de esta codificación que no saberlo.

Y como fue el caso con la codificación octal, Java tiene una forma de codificar literales utilizando el sistema binario. Es decir, literales compuestos solo por 0 y 1. Para que el compilador de Java entienda 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, todos los literales binarios se identifican 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.


3. Codificación hexadecimal

Además de las codificaciones octales y binarias, los literales también se pueden escribir en hexadecimal. Esta es una codificación muy popular.

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

Es por eso que a los programadores se les ocurrió el sistema hexadecimal. Después de todo, 16 es 2 elevado a la cuarta potencia, por lo que exactamente 4 bits corresponden a un dígito hexadecimal. En términos generales, cada 4 bits ahora se pueden escribir como un solo dígito hexadecimal.

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

Ok, dices, está bastante claro cómo obtuvimos el sistema octal: simplemente eliminamos los números 8 y 9, pero ¿dónde obtenemos los 6 símbolos adicionales para el sistema hexadecimal? ¡Me gustaria verlos!

Todo es sencillo. Las primeras 6 letras del alfabeto inglés se tomaron como los 6 símbolos faltantes: 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
0xB _ 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


4. Cómo convertir un número de hexadecimal

Convertir un número de hexadecimal a decimal es muy fácil. 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 nos movemos 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 corresponde al 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

Ya sabes cómo se almacena este número en la memoria:

0x A F C F

Pero 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 o exponenciación".