JavaRush /Blog Java /Random-ES /Java: bits y bytes
Viacheslav
Nivel 3

Java: bits y bytes

Publicado en el grupo Random-ES
Java: bits y bytes - 1

Introducción

Si las personas cuentan en el sistema numérico decimal, las computadoras cuentan en el sistema binario. Y un programador debe saber cómo hablar tanto con personas como con computadoras. Esta revisión debería ayudar en este asunto. A veces hay todo un mundo escondido detrás de lo obvio. Propongo hablar de este mundo. Por ejemplo, hay 7 días en una semana. Ahora, respondamos la pregunta: ¿Qué es el número “7”? ) En primer lugar, es un número natural entero (positivo). También es un número decimal. Un número decimal es un número en el Sistema Decimal. Cuando decimos "sistema numérico decimal", significa que el sistema numérico tiene una base de 10 . La base muestra cuántos dígitos se pueden usar en un sistema numérico determinado para representar un número. La cuenta atrás es desde cero. En consecuencia, para representar números en el sistema numérico decimal, usamos números del 0 al 9. Esto es bueno, pero necesitamos contar no solo hasta 9, sino también más allá. ¿Cómo ser? Por ejemplo, el número 10. Para escribir este número utilizamos hasta 2 dígitos. La posición de cada dígito en el sistema decimal se llama lugar decimal. Los dígitos se cuentan de derecha a izquierda:
Java: bits y bytes - 2
Además, el número decimal se puede ampliar de la siguiente manera: 103 = 1*10^2 + 0*10^1 + 3*10^0
Java: bits y bytes - 3
Básicamente, el número crece de derecha a izquierda. Es decir, al principio era 7 y luego pasó a ser 10. Por lo tanto, los dígitos se cuentan desde la derecha, comenzando desde cero. ¿Para qué es todo esto? Esto se debe a que no somos computadoras. Y mientras contamos en decimal (es decir, base 10), las computadoras cuentan en binario (es decir, base 2). Pero las reglas que se aplican en estos sistemas numéricos son las mismas.
Java: bits y bytes - 4

Sistema binario

El sistema binario es muy similar al sistema decimal, con la única diferencia de que el límite aquí no es 10, sino 2. Comparémoslo con un ejemplo. ¿Cómo representamos el 11 en binario? Es muy sencillo: sólo necesitas dividir el número decimal entre base 2, es decir, contar 11/2 en una columna. Ejemplo:
Java: bits y bytes - 5
O aquí hay un ejemplo de WikiHow:
Java: bits y bytes - 6
Curiosamente, podemos representar un número en binario de la misma manera que en decimal: 111 en binario = 1*2^2 + 1*2^1 + 1*2^0 = 4 + 2 + 1
Java: bits y bytes - 7
En la calculadora online se puede ver un ejemplo de conversión de binario a decimal . Hablando de que las reglas de operación en los sistemas numéricos son las mismas, veamos la suma en el sistema binario:
Java: bits y bytes - 8
Como puede ver, transferimos dígitos durante la suma de la misma manera que en el sistema decimal. El análisis de la suma se puede ver, por ejemplo, aquí: Por cierto, periódicamente se menciona alguna palabra "descarga". ¿Y qué es eso? El lugar es sólo un "elemento estructural" para representar un número. Es decir, el número 10 consta de dos dígitos: necesitamos 2 dígitos, 2 lugares, 2 elementos para escribir este número. Es importante que entendamos esto porque en el sistema numérico binario, un dígito es un bit . La palabra Bit proviene del inglés “binary digit” , es decir, un número binario. Puede ser 0 o 1. Pero así como leemos números y palabras en su conjunto, y no letra por letra, las computadoras no leen un bit a la vez. Para la "pieza" mínima de información procesada en la RAM (la llamada unidad de información direccionable más pequeña), se lee una secuencia de 8 bits . Como hay 8, este se llama "octeto". Y también, la palabra más conocida Byte . Para recordar el octeto, puedes recordar que la palabra pulpo (ocho patas) se traduce al inglés como pulpo. Es decir, aquí está exactamente el mismo "octo" en el título:
Java: bits y bytes - 9
Pensemos en ¿cuál es el número máximo que podemos representar como 8 bits?
Java: bits y bytes - 10
Y aquí surge la pregunta: ¿qué pasa con los números negativos? Para entender esto, hablemos de cómo se representan los bytes en Java.
Java: bits y bytes - 11

Java y bytes

¿Cómo es que podemos usar números negativos en Java? Se hace de forma sencilla. En Java, los bytes están firmados. El dígito/bit más a la izquierda (también llamado “bit más significativo”) se convierte en una especie de “marcador” que responde a la pregunta: “¿Es este número negativo?” Si la respuesta es sí, entonces el marcador tiene el valor 1. De lo contrario, es 0. Veamos un ejemplo de cómo convertir el número 5 en un número negativo 5:
Java: bits y bytes - 12
Con base en esta imagen, puede comprender los límites dentro de los cuales se encuentra un valor de Byte:
Java: bits y bytes - 13
También está claro que:
  • si sumamos uno a 127, obtenemos -128.
  • si restamos uno a -128, obtenemos 127.
Así, Byte en Java puede tomar un valor de -128 a 127. Como recordamos, un byte es un octeto. Y el dígito máximo/bit más significativo tiene un número de serie de 7, ya que contamos desde cero. En este caso, es fácil recordar que un byte es igual a -2 elevado a 7 (límite inferior) a 2 elevado a 7 menos 1 (límite superior). Trabajar con el tipo de datos en sí es sencillo. Usamos el compilador de Java en línea “repl.it” como “sandbox” para este artículo. https://repl.it/languages/java. Por ejemplo, ejecutemos el código que representará una variable de bytes en formato binario como una cadena:
class Main {
  public static void main(String[] args) {
    byte octet = 5;
    String bin = String.format("%8s", Integer.toBinaryString(octet)).replace(' ', '0');
    System.out.println(bin);
  }
}
Trabajar con bytes se utiliza activamente cuando se trabaja con flujos de E/S. Puede leer más en el tutorial de Oracle: " I/O Streams ". Además, en Java puedes usar un literal especial para especificar el valor como bits:
class Main {
  public static void main(String[] args) {
    byte data = 0b101;
    System.out.println(data);
  }
}
Java: bits y bytes - 14

Manipulación de bits

En cuanto a los bytes y los bits, no se puede dejar de mencionar varias manipulaciones de bits. Probablemente la operación más común sean los desplazamientos (desplazamiento bit a bit o desplazamiento de bits). Y todo porque su resultado tiene claros beneficios prácticos. ¿Cual es el uso? Desplazarse hacia la izquierda N posiciones equivale a multiplicar el número por 2N. Y un desplazamiento hacia la derecha es similar a la misma división, por lo tanto, 5<<2 == 5*Math.pow(2,2) Y para entender por qué esto es así, veamos este ejemplo con más detalle:
Java: bits y bytes - 15
La negación bit a bit NOT (Unario bit a bit), que se representa mediante una tilde, invierte los bits. Se escribe como tilde, por ejemplo ~5.
public static void main(String[] args) {
	System.out.println(~5); //-6
 	System.out.println(~-5);//4
}
Esto muestra una vez más que cuando Java cambia el signo de un número, además de invertir los valores de los bits al final, realizamos +1. Y sin esto, como vemos, nuestro número 5 cambia. Y para que siga siendo el mismo número que antes de cambiar de signo, debes hacer +1. Bit a bit AND le permite dejar dos números diferentes con el valor 1 por un bit solo si todos los bits tienen el valor uno. Lo interesante de esto puede ser que tiene algunos beneficios de aplicación:
int x=4;
System.out.println((x&1) != 1);
Este código verifica la paridad del número x. Veamos un ejemplo:
Java: bits y bytes - 16
Al usar Bitwise AND y Bitwise OR juntos, puede usar máscaras:
public static void main(String[] args) {
    byte optionA=0b0100;
    byte optionB=0b0010;
    byte optionC=0b0001;
    byte value = (byte)(optionB | optionC);
    // Check for optionB
    if ((optionC & value) != 0b0000) {
      System.out.println("Yes");
    } else {
      System.out.println("No");
    }
  }
Consulte " Opciones de enmascaramiento con operadores bit a bit en Java " para obtener más detalles . La manipulación de bits es un tema interesante sobre el que se han escrito reseñas, artículos y libros independientes. Y a partir de aquí comienza el largo camino hacia la criptografía. Como parte de esta revisión, vale la pena entender por qué funciona y cómo. Para obtener más información sobre las operaciones de bits, recomiendo leer la reseña de tproger: " Acerca de las operaciones de bits ".

tipos primitivos

Entonces, un byte es un octeto, es decir, 8 bits. Es fácil recordar que en Java también hay 8 tipos primitivos, casualmente. Un tipo primitivo es un tipo de datos integrado en un lenguaje de programación, es decir, disponible de forma predeterminada. byte es el tipo de datos primitivo más pequeño en términos de huella de memoria con el que Java puede trabajar. Como dijimos anteriormente, un byte ocupa 8 bits. Por lo tanto, el dígito más significativo es el número 7. Por lo tanto, el byte contiene los valores desde -2 a la séptima potencia hasta 2 a la séptima potencia menos 1 del resultado. ¿Qué otros tipos primitivos existen?
Java: bits y bytes - 17
Como podemos ver en la tabla, los tipos de datos en términos de cantidad de datos ocupados se duplican. Es decir, short = 2 * byte e int = 2 * short. En realidad, es fácil de recordar. Recuerda que byte = 8 bits. También se recuerda que no puede ser menos. En inglés, un número entero se llama número entero. El tipo primitivo se llamó abreviatura int. Hay un número entero regular: int. Hay una versión corta, corta, y una versión larga, larga. En consecuencia, int ocupa 32 bits (4 bytes). La versión corta es 2 veces más pequeña: 16 bits (2 bytes), y la versión larga es el doble, es decir. 64 bits (8 bytes). Entonces, un int puede almacenar como máximo un número de aproximadamente 2 mil millones cien millones. Y durante mucho tiempo puede almacenar un máximo de unos 9 cuatrillones (una bonita palabra). Recordando el viejo chiste de que un programador novato piensa que hay 1000 bytes en un kilobyte, y un programador completo cree que hay 1024 gramos en un kilogramo, podemos entender:
1 mb = 1024 Kbyte = 1024 * 1024 = 1048576 bytes
1 int = 4 bytes
1 mb = 262144 int
Por cierto, un lector atento habrá notado que en la imagen solo hay 7 tipos. 8 el tipo primitivo es booleano. booleano es un tipo de datos booleano que tiene sólo dos valores: verdadero y falso. Pero surge la pregunta: ¿qué tamaño es? La Especificación de la Máquina Virtual Java y el apartado " 2.3.4. El Tipo booleano " nos responderán:
Java: bits y bytes - 18
Es decir, sólo un booleano tomará la misma cantidad que un int. Si declaramos una matriz booleana, cada elemento de la matriz ocupará 1 byte. Estos son esos milagros :)

Conclusión

Le sugiero que se familiarice con un par de materiales más para consolidar: #viacheslav
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION