web-dev-qa-db-fra.com

Comment fonctionne l'opérateur de complément au niveau du bit (~ tilde)?

Pourquoi est-ce que ~ 2 est égal à -3? Comment fonctionne l'opérateur ~?

165
bala

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 de deux: (8 bits)

1111 1110

Vous obtenez ceci en prenant la représentation binaire 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.

Voyons comment nous obtenons ~ 2 = -3:

En voici encore deux:

0000 0010

Il suffit de retourner tous les bits et nous obtenons:

1111 1101

Eh bien, à quoi ressemble -3 en complément de deux? Commencez par positif 3: 0000 0011, basculez tous les bits sur 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.

L'opérateur de complément (~) JUST FLIPS BITS. C'est à la machine d'interpréter ces bits.

258
Anthony

~ retourne les bits dans la valeur.

Pourquoi ~2 est -3 a à voir avec la façon dont les nombres sont représentés bit par bit. Les nombres sont représentés par complément à deux .

Donc, 2 est la valeur binaire

00000010

Et ~ 2 retourne les bits de sorte que la valeur est maintenant:

11111101

Qui est la représentation binaire de -3.

36
driis

Comme d'autres l'ont mentionné, ~ vient d'inverser des bits (passe de un à zéro et de zéro à un) et puisque complément à deux est utilisé, vous obtenez le résultat que vous avez vu.

Une chose à ajouter est pourquoi le complément de à deux est utilisé, afin que les opérations sur les nombres négatifs soient les mêmes que sur les nombres positifs. Pensez à -3 comme le nombre auquel 3 doit être ajouté pour obtenir zéro et vous verrez que ce nombre est 1101, rappelez-vous que l'addition binaire est comme une école élémentaire ( décimal), vous n’en portez qu’un lorsque vous arrivez à deux plutôt qu’à 10.

 1101 +
 0011 // 3
    =
10000
    =
 0000 // lose carry bit because integers have a constant number of bits.

Donc 1101 est -3, retournez les bits que vous obtenez 0010 qui est deux.

16
Motti

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ément".

Le saviez-vous? Il existe également "son complément" où les nombres inverses sont symétriques, et il a à la fois un 0 et un -0.

8
gbarry

Je sais que la réponse à cette question est affichée depuis longtemps, mais je voulais partager ma réponse pour la même chose.

Pour trouver le complément d’un nombre, commencez par trouver son équivalent binaire. Ici, le nombre décimal 2 est représenté par 0000 0010 sous forme binaire. Maintenant, prenons son complément en inversant (en retournant tous les 1 en 0 et tous les 0 en 1) tous les chiffres de sa représentation binaire, 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 égal à 1 dans le nombre binaire, cela signifie que le signe est négatif pour le nombre qu’il a stocké. (ici, le nombre mentionné est pas 2 mais le complément de 2).

Maintenant, puisque les nombres sont stockés en tant que complément à 2 (prenant le complément à un d'un nombre plus un), donc pour afficher ce nombre binaire, 1111 1101, en décimal, nous devons d'abord trouver son complément à 2, qui sera :

1111 1101 → 0000 0010 + 1 → 0000 0011

Ceci est le complément de 2. La représentation décimale du nombre binaire, 0000 0011, est 3. Et, puisque le bit de signe en était un comme mentionné ci-dessus, la réponse résultante est donc -3.

Indice: Si vous lisiez cette procédure attentivement, vous auriez alors constaté que le résultat de l'opérateur du complément à un est réellement le nombre (opérande - auquel cet opérateur est appliqué) plus un avec un signe négatif . Vous pouvez aussi essayer ceci avec d'autres chiffres.

5

int a = 4; System.out.println (~ a); Le résultat serait: -5

'~' de tout nombre entier dans Java représente le complément à 1 du no. par exemple, je prends ~ 4, ce qui signifie dans la représentation binaire 0100. premièrement, la longueur d'un entier est de quatre octets, c'est-à-dire 4 * 8 (8 bits pour 1 octet) = 32. Ainsi, dans la mémoire système 4 est représentée par 0000 0000 0000 0000 0000 0000 0000 0100 maintenant ~ l'opérateur effectuera le complément à 1 sur le numéro binaire ci-dessus

c'est-à-dire 1111 1111 1111 1111 1111 1111 1111 1011-> complément de 1, le bit le plus significatif représente le signe du non (ou - ou +) s'il est égal à 1, le signe est '-' s'il est égal à 0, le signe est un '+' selon notre 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, puis ajoutez-y un complément à 1). tous deviendront des zéros, à l'exception du bit le plus significatif 1 (qui est notre représentation sous forme de signe du nombre, cela signifie que pour les 31 bits restants 1111 1111 1111 1111 1111 1111 1111 1111 1011 (résultat acquis de l'opérateur ~) 1000 0000 0000 0000 0000 0000 0000 0100 (complément de 1)

1 (2's complement)

1000 0000 0000 0000 0000 0000 0000 0101 maintenant le résultat est -5 consultez ce lien pour la vidéo <[Opérateurs intelligents en Java] https://youtu.be/w4pJ4cGWe9Y

4
Mike Aluydiav

Simplement ...........

En tant que complément à 2 de tout nombre, nous pouvons calculer en inversant tous les 1 en 0 et vice-versa que nous lui ajoutons 1 ..

Ici, N = ~ N produisent des résultats - (N + 1) toujours. Parce que le système stocke les données sous la forme d'un 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 est d'où Minus vient. Mon opinion est supposons que nous ayons un registre de 32 bits, ce qui signifie que 2 ^ 31 -1 bits sont impliqués dans le fonctionnement et qu’il reste un bit qui change lors du calcul précédent (complément) stocké sous la forme d’un bit de signe qui est généralement égal à 1. Et nous obtenons le résultat sous la forme ~ 10 = -11.

~ (-11) = 10;

Ce qui précède est vrai si printf ("% d", ~ 0); on obtient le résultat: -1;

Mais printf ("% u", ~ 0) que le résultat: 4294967295 sur une machine 32 bits.

2

Je pense que pour la plupart des gens, la confusion provient de la différence entre un nombre décimal et un nombre binaire signé, alors clarifions-le d'abord:

pour le monde humain décimal: 01 signifie 1, -01 signifie -1, pour le monde binaire 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 de la confusion entre le résultat signé (101 = -3) et le résultat sans choix (101 = 5)

1
user7537910

L'opérateur complémentaire au niveau du bit (~) est un opérateur naire.

Cela fonctionne selon les méthodes suivantes

D'abord, il convertit le nombre décimal donné en sa valeur binaire correspondante. Dans le cas de 2, il convertit d'abord 2 en 0000 0010 (en nombre binaire sur 8 bits).

Ensuite, tout le 1 du nombre est converti en 0 et tous les zéros en 1. Le nombre devient 1111 1101.

c'est la représentation du complément à 2 de -3.

Afin de trouver la valeur non signée en utilisant complément, c'est-à-dire. Pour convertir simplement 1111 1101 en décimal (= 4294967293), nous pouvons simplement utiliser le% u lors de l’impression.

1
james.bondu

Fondamentalement, l'action est un complément et non une négation.

Ici x = ~ x produisent des résultats - (x + 1) toujours.

x = ~ 2

- (2 + 1)

-3

0
Sunil

Nous devons d’abord scinder le chiffre donné en ses chiffres binaires, puis l’inverser en ajoutant au dernier chiffre binaire.Après cette exécution, nous devons donner au signe précédent le signe opposé à celui que nous trouvons conforme ~ 2 = -3 Explication : La forme binaire 2s correspond à 00000010 et est remplacée par 11111101, il s'agit d'un complément, puis conforme 00000010 + 1 = 00000011, qui est la forme binaire de trois et avec -sign Ie, -3

0
balusabavath

Le tilde Javascript (~) contraint une valeur donnée à son complément - tous les bits sont inversés. C'est tout ce que le tilde fait. Ce n'est pas 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 de la CPU sont sujets à interprétation en fonction de plusieurs facteurs. Au niveau 'code', dans ce cas JavaScript, ils sont interprétés comme un entier signé de 32 bits par définition (laissez les flottants en dehors de cela). Pensez-y comme quantique, ces 32 bits représentent plusieurs valeurs possibles en même temps. Cela dépend entièrement de l'objectif de conversion dans lequel vous les 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 en même temps.

0
Elvn

L'opérateur bit à bit est un opérateur unaire qui travaille sur la méthode du signe et de la magnitude selon mon expérience et mes connaissances.

Par exemple, ~ 2 donnerait -3.

En effet, l'opérateur binaire représenterait d'abord le nombre sous forme de signe et de magnitude, qui est 0000 0010 (opérateur sur 8 bits), le bit le plus significatif étant le bit de signe.

Puis plus tard, il prendrait le nombre négatif de 2 qui est -2.

-2 est représenté par 1000 0010 (opérateur de 8 bits) en signe et en amplitude.

Plus tard, il ajoute 1 au LSB (1000 0010 + 1), ce qui vous donne 1000 0011.

Qui est -3.

0