JavaRush /Blog Java /Random-FR /Négation au niveau du bit - pourquoi en est-il ainsi ?
Alex Bolgov
Niveau 37
Ташкент

Négation au niveau du bit - pourquoi en est-il ainsi ?

Publié dans le groupe Random-FR
Bonjour à tous :) En lisant l'article Opérations au niveau des bits, je me suis posé, comme d'autres, une question : pourquoi, lorsqu'on inverse le nombre 342, on obtient -343. Voilà à quoi ça ressemble dans l'article : Négation au niveau du bit - pourquoi - 1Ceux qui sont particulièrement curieux (comme moi) ont une question : « hé, mais 010101001 est inférieur à 101010110, c'est logique qu'il soit inférieur à 342 et positif. En le saisissant dans n'importe quel convertisseur de numéros en ligne ou en le vérifiant à l'aide du code :
Integer a = Integer.valueOf("010101001", 2);
System.out.println(Integer.toString(a, 10));
de manière inattendue, nous obtenons autre chose que -343...
169
Oh, comme c'est bien qu'il était une fois, dans un cours de programmation en C, d'une manière ou d'une autre, j'ai brièvement entendu quelque chose à propos du chiffre signe dans les nombres entiers. Après avoir cherché un moment sur Google, je peux maintenant expliquer de quel genre d'animal il s'agit. Négation au niveau du bit - pourquoi - 2En fait, il y a une inexactitude dans l’article, ce qui porte à confusion. Si l'on vérifie avec le code quel est réellement le résultat de l'inversion du nombre 342 :
int a = 342;
System.out.println(Integer.toBinaryString(~a));
alors nous verrons un résultat légèrement différent
1111111111111111111111010101001
Pourquoi cela est-il ainsi? Le fait est qu’une variable ne peut pas simplement contenir 101010110 ; en fait, elle est stockée sous
000000000000000000000000101010110
Après tout, une variable int prend 4 octets, c'est-à-dire 32 bits - 32 cellules mémoire. Après inversion, absolument tous les nombres changent, c'est-à-dire et les zéros non significatifs "tronqués". Vient maintenant la partie amusante. Puisque dans la représentation binaire, le signe + ou - devant un nombre ne peut pas être stocké, il existe une astuce : le tout premier bit est en fait responsable du signe et est précisément le bit de signe . Et tous les nombres sont stockés selon cette logique : les nombres de 00...000 à 01...111 sont positifs, à partir de 0 (c'est-à-dire de 0 à 2147483647) et à partir de 10...000 à 11... 111. sont des valeurs négatives, commençant par le plus petit et se terminant par -1 (c'est-à-dire -2147483648 à -1).
00000000000000000000000000000000 = 0
01111111111111111111111111111111 = 2147483647
10000000000000000000000000000000 = -2147483648
11111111111111111111111111111111 = -1
Et puis vous demandez : « D'accord, Navalny, nous vous croirons, mais pourquoi avez-vous décidé que c'était son palais », mais comment cela se passe-t-il en -343 avec tout cela ? C'est vraiment simple. Nous pouvons simplement calculer cela manuellement. Si nous "coupons" (ou remplaçons par 0) le tout premier bit de la version binaire du nombre résultant 342 ( 1111111111111111111111111111111111111010101001 ) et le remettons sous forme décimale.
String s = "01111111111111111111111010101001";
System.out.println(s + " = " + Integer.toString(Integer.valueOf(s, 2), 10));
alors nous obtenons ça
0111111111111111111111010101001 = 2147483305
En fait, ici, nous n’avons pas simplement « coupé » 1 au début, mais nous avons soustrait de ce nombre 10 000 000 000 000 000 000 000 000 000 000. Rajoutons-le maintenant, mais sous forme décimale. Ce que nous verrons :
~342 =
11111111111111111111111010101001 =
//в двоичном виде//
01111111111111111111111010101001 +
10000000000000000000000000000000
=
//в десятичном виде//
-2147483648 + 2147483305 = -343
Voici le numéro requis -343 :) Les gars, c'est mon premier post ici, veuillez l'aimer si vous l'avez aimé et s'il était informatif (je veux vraiment rassembler toutes les réalisations 😄) Vous pouvez en savoir plus sur ce sujet ici : Bonne chance à tous et merci pour votre attention)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION