JavaRush /Blog Java /Random-ES /Negación bit a bit: ¿por qué es así?
Alex Bolgov
Nivel 37
Ташкент

Negación bit a bit: ¿por qué es así?

Publicado en el grupo Random-ES
Hola a todos :) Mientras leía el artículo Operaciones bit a bit, yo, como otros, tenía una pregunta: por qué, cuando invertimos el número 342, obtenemos -343. Así aparece en el artículo: Negación bit a bit: por qué es así - 1Los que son especialmente curiosos (como yo) tienen una duda: “oye, pero 010101001 es menor que 101010110, lo lógico es que sea menor que 342 y positivo”. Escribiéndolo en cualquier conversor de números en línea o comprobándolo usando el código:
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
inesperadamente obtenemos algo distinto a -343...
169
Oh, qué bueno que una vez, en una clase de programación en C, de alguna manera escuché brevemente algo sobre el dígito de signo en números enteros. Después de buscar un rato en Google, ahora puedo explicar qué tipo de animal es este. Negación bit a bit: por qué es así - 2De hecho, hay una inexactitud en el artículo que resulta confusa. Si comprobamos con el código cuál es realmente el resultado de invertir el número 342:
int a = 342;
System.out.println(Integer.toBinaryString(~a));
entonces veremos un resultado ligeramente diferente
11111111111111111111111010101001
¿Por qué esto es tan? El caso es que una variable no puede contener simplemente 101010110; de hecho, se almacena como
000000000000000000000000101010110
Después de todo, una variable int ocupa 4 bytes, es decir 32 bits - 32 celdas de memoria. Después de la inversión, absolutamente todos los números cambian, es decir y ceros iniciales "recortados". Ahora viene la parte divertida. Dado que en la representación binaria el signo + o - delante de un número no se puede almacenar, hay un truco: el primer bit es en realidad responsable del signo y es precisamente el bit de signo . Y todos los números se almacenan según esta lógica: los números del 00...000 al 01...111 son positivos, empezando por 0 (es decir, de 0 a 2147483647) y empezando por 10...000 hasta 11... 111. son negativos, comenzando desde el más pequeño y terminando en -1 (es decir, -2147483648 a -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
Y luego preguntas: "Está bien, Navalny, te creeremos, pero ¿por qué decidiste que este es su palacio", pero cómo resulta ser -343 con todo esto? Es realmente sencillo. Simplemente podemos calcular esto manualmente. Si "cortamos" (o reemplazamos con 0) el primer bit de la versión binaria del número resultante 342 ( 1111111111111111111111111111111111111111010101001 ) y lo devolvemos a su forma decimal.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
entonces entendemos eso
01111111111111111111111010101001 = 2147483305
De hecho, aquí no simplemente “cortamos” 1 al principio, sino que le restamos 10000000000000000000000000000000000. Ahora volvamos a sumarlo, pero en forma decimal. Lo que veremos:
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Aquí está el número requerido -343 :) Chicos, esta es mi primera publicación aquí, dale me gusta si te gustó y fue informativo (realmente quiero recopilar todos los logros 😄) Puedes leer más sobre este tema aquí: Buena suerte a todos y gracias por su atención)
Comentarios
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION