Pourquoi est-ce que ~ 2 est égal à -3? Comment fonctionne ~
opérateur?
Rappelez-vous que les nombres négatifs sont stockés en tant que complément à deux de la contrepartie positive. A titre d’exemple, voici la représentation de -2 en complément à deux: (8 bits)
1111 1110
La façon dont vous obtenez ceci est en prenant la représentation binary d’un nombre, en prenant son complément (en inversant tous les bits) et en en ajoutant un. Deux commence par 0000 0010, et en inversant les bits, nous obtenons 1111 1101. En ajoutant un, nous obtenons le résultat ci-dessus. Le premier bit est le bit de signe, impliquant un négatif.
Alors regardons comment on obtient ~ 2 = -3:
Voici encore deux:
0000 0010
Il suffit de retourner tous les bits et nous obtenons:
1111 1101
Eh bien, à quoi ressemble -3 dans le complément à deux? Commencez par 3: 0000 0011 positif, retournez tous les bits à 1111 1100 et ajoutez-en un pour devenir une valeur négative (-3), 1111 1101.
Donc, si vous inversez simplement les bits dans 2, vous obtenez la représentation du complément à deux de -3.
~
retourne les bits dans la valeur.
Pourquoi ~2
est -3
a trait à la manière dont les nombres sont représentés au niveau du bit. Les nombres sont représentés par un complément à deux .
Donc, 2 est la valeur binary
00000010
Et ~ 2 retourne les bits de sorte que la valeur est maintenant:
11111101
Qui est la représentation binary de -3.
Comme d’autres l’ont mentionné ~
juste des bits retournés (change de un à zéro et de zéro à un) et puisque le complément à deux est utilisé, vous obtenez le résultat que vous avez vu.
Une chose à append est la raison pour laquelle le complément à deux est utilisé, de sorte que les opérations sur les nombres négatifs seront les mêmes que pour les nombres positifs. Pensez à -3
comme le nombre auquel 3
devrait être ajouté pour obtenir zéro et vous verrez que ce nombre est 1101
, rappelez-vous que l’addition binary est comme l’ajout de l’école élémentaire (décimale) que vous en avez une quand vous arrivez deux plutôt que 10.
1101 + 0011 // 3 = 10000 = 0000 // lose carry bit because integers have a constant number of bits.
Par conséquent, 1101
est -3
, retournez les bits que vous obtenez 0010
ce qui est deux.
Cette opération est un complément, pas une négation.
Considérez que ~ 0 = -1 et travaillez à partir de là.
L’algorithme de négation est “complément, incrémentation”.
Le saviez-vous? Il y a aussi “son complément” où les nombres inverses sont symésortingques et a à la fois un 0 et un -0.
int a = 4; System.out.println (~ a); Le résultat serait: -5
‘~’ de tout entier en Java représente le complément de 1 du no. par exemple, je prends ~ 4, ce qui signifie en représentation binary 0100. Premièrement, la longueur d’un entier est de quatre octets, soit 4 * 8 (8 bits pour 1 octet) = 32. Donc, dans la mémoire système 4 est représenté par 0000 0000 0000 0000 0000 0000 0000 0100 maintenant ~ opérateur effectuera le complément de 1 sur le binary ci-dessus no
c’est-à-dire 1111 1111 1111 1111 1111 1111 1111 1011-> 1 complément le plus significatif représente le signe du non (soit – ou +) s’il est 1 alors le signe est ‘-‘ s’il est 0 alors le signe est ‘+’ Ce résultat est un nombre négatif. En java, les nombres négatifs sont stockés sous forme de complément à 2, le résultat acquis doit être converti en complément à 2 (effectuez d’abord le complément à 1 et ajoutez simplement le complément à 1). tous les 1 deviendront des zéros, sauf le bit le plus significatif 1 (qui est notre représentation en signe du nombre, c’est-à-dire pour les 31 bits restants 1111 1111 1111 1111 1111 1111 1011 (résultat de l’opérateur ~) 1000 0000 0000 0000 0000 0000 0000 0100 (complément à 1)
1000 0000 0000 0000 0000 0000 0000 0101 maintenant le résultat -5 consultez ce lien pour la vidéo <[Opérateurs peu avisés dans Java] https://youtu.be/w4pJ4cGWe9Y
Je sais que la réponse à cette question est postée depuis longtemps, mais je voulais partager ma réponse pour la même chose.
Pour trouver le complément d’un nombre, trouvez d’abord son équivalent binary. Ici, le nombre décimal 2
est représenté par 0000 0010
sous forme binary. En prenant maintenant son complément en inversant (retournant tous les 1 en 0 et tous les 0 en 1) tous les chiffres de sa représentation binary, ce qui donnera:
0000 0010 → 1111 1101
C’est le complément du nombre décimal 2. Et depuis le premier bit, c’est-à-dire que le bit de signe est 1 dans le nombre binary, cela signifie que le signe est négatif pour le nombre stocké. (ici, le nombre mentionné n’est pas 2 mais le complément de 2).
Maintenant, comme les nombres sont stockés en tant que complément à 2 (en prenant le nombre d’un plus un), pour afficher ce nombre binary, 1111 1101
, en décimal, nous devons d’abord trouver son complément à 2, qui sera:
1111 1101 → 0000 0010 + 1 → 0000 0011
C’est le complément à 2. La représentation décimale du nombre binary, 0000 0011
, est 3
. Et comme le bit de signe en était un comme mentionné ci-dessus, la réponse résultante est -3
.
Astuce: Si vous lisez attentivement cette procédure, alors vous auriez observé que le résultat pour l’opérateur du complément est en réalité le numéro (opérande – sur lequel cet opérateur est appliqué) plus un avec un signe négatif. Vous pouvez aussi essayer cela avec d’autres numéros.
Simplement ………..
Comme complément à 2 de tout nombre, nous pouvons calculer en inversant tous les 1 à 0 et vice-versa que nous ajoutons 1 à lui.
Ici, N = ~ N produit des résultats – (N + 1) toujours. Parce que le système stocke les données sous forme de complément à 2, ce qui signifie qu’il stocke ~ N comme ceci.
~N = -(~(~N)+1) =-(N+1).
Par exemple::
N = 10 = 1010 Than ~N = 0101 so ~(~N) = 1010 so ~(~N) +1 = 1011
Maintenant, le point vient d’où vient Minus. Mon avis est supposé que nous ayons un registre de 32 bits qui signifie 2 ^ 31 -1 bit impliqué dans le fonctionnement et pour reposer un bit qui change dans le calcul précédent (complément) stocké en tant que bit de signe qui est habituellement 1. Et nous obtenons un résultat de ~ 10 = -11.
~ (-11) = 10;
Ce qui précède est vrai si printf (“% d”, ~ 0); nous obtenons un résultat: -1;
Mais printf (“% u”, ~ 0) que le résultat: 4294967295 sur une machine 32 bits.
L’opérateur de complément binary (~) est un opérateur unaire .
Cela fonctionne selon les méthodes suivantes
D’abord, il convertit le nombre décimal donné en sa valeur binary correspondante. C’est-à-dire qu’en cas de 2, il convertit d’abord 2 en 0000 0010 (en un nombre binary de 8 bits).
Ensuite, il convertit tous les 1 du nombre à 0 et tous les zéros à 1, puis le nombre deviendra 1111 1101.
c’est la représentation du complément à 2 de -3.
Pour trouver la valeur non signée à l’aide du complément, c’est-à-dire simplement pour convertir 1111 1101 en décimal (= 4294967293), nous pouvons simplement utiliser le% u pendant l’impression.
Je pense que pour la plupart des gens, la partie confusion vient de la différence entre le nombre décimal et le nombre binary signé.
pour le monde décimal humain: 01 signifie 1, -01 signifie -1, pour le monde binary de l’ordinateur: 101 signifie 5 s’il n’est pas signé. 101 signifie (-4 + 1) si est signé alors que le chiffre signé est à la position x. | X
le bit retourné de so 2 = ~ 2 = ~ (010) = 101 = -4 + 1 = -3 la confusion vient du mélange du résultat signé (101 = -3) et du résultat non mis (101 = 5)
Nous devons d’abord diviser le chiffre donné en chiffres binarys, puis l’inverser en ajoutant le dernier chiffre binary. Après cette exécution, nous devons donner le signe opposé au chiffre précédent, celui que nous trouvons le complément. ~ 2 = -3 Explication : La forme binary de 2s est 00000010 change à 11111101 ceci est un complément, puis conforme 00000010 + 1 = 00000011 qui est la forme binary de trois et avec -sign Ie, -3
L’opérateur binary est un opérateur unitaire qui travaille selon la méthode des signes et de la magnitude conformément à mon expérience et à mes connaissances.
Par exemple, ~ 2 donnerait -3.
Cela est dû au fait que l’opérateur de bit représente d’abord le nombre en signe et en magnitude qui est 0000 0010 (opérateur à 8 bits) où le bit de poids fort est le bit de signe.
Ensuite, le nombre négatif de 2 serait -2.
-2 est représenté par 1000 0010 (opérateur 8 bits) en signe et en amplitude.
Plus tard, il ajoute un 1 au LSB (1000 0010 + 1) qui vous donne 1000 0011.
Qui est -3.
Javascript tilde (~) contraint une valeur donnée au complément – tous les bits sont inversés. C’est tout ce que tilde fait. Ce n’est pas un signe d’opinion. Il n’ajoute ni ne soustrait aucune quantité.
0 -> 1 1 -> 0 ...in every bit position [0...integer nbr of bits - 1]
Sur les processeurs de bureau standard utilisant des langages de haut niveau tels que JavaScript, l’arithmétique signée BASE10 est la plus courante, mais gardez à l’esprit que ce n’est pas le seul. Les bits au niveau du processeur sont sujets à interprétation en fonction d’un certain nombre de facteurs. Au niveau ‘code’, dans ce cas-ci JavaScript, ils sont interprétés par définition comme un entier signé 32 bits (laissez les flottants en dehors de cela). Considérez-le comme un quantum, ces 32 bits représentent de nombreuses valeurs possibles à la fois. Cela dépend entièrement de la lentille de conversion que vous visualisez.
JavaScript Tilde operation (1's complement) BASE2 lens ~0001 -> 1110 - end result of ~ bitwise operation BASE10 Signed lens (typical JS implementation) ~1 -> -2 BASE10 Unsigned lens ~1 -> 14
Tout ce qui précède est vrai au même moment.