web-dev-qa-db-fra.com

~ x + ~ y == ~ (x + y) est toujours faux?

Ce code est-il toujours évalué à faux? Les deux variables sont des entiers signés en complément à deux.

~x + ~y == ~(x + y)

Je pense qu'il devrait y avoir un certain nombre qui satisfasse aux conditions. J'ai essayé de tester les nombres entre -5000 et 5000 mais n'a jamais atteint l'égalité. Existe-t-il un moyen de mettre en place une équation pour trouver les solutions à la condition?

Est-ce que l'échange de l'un pour l'autre causera un bug insidieux dans mon programme?

153
Steve

Supposons pour des raisons de contradiction qu'il existe des x et des y (mod 2n) tel que

~(x+y) == ~x + ~y

Par complément à deux *, nous savons que,

      -x == ~x + 1
<==>  -1 == ~x + x

Notant ce résultat, nous avons,

      ~(x+y) == ~x + ~y
<==>  ~(x+y) + (x+y) == ~x + ~y + (x+y)
<==>  ~(x+y) + (x+y) == (~x + x) + (~y + y)
<==>  ~(x+y) + (x+y) == -1 + -1
<==>  ~(x+y) + (x+y) == -2
<==>  -1 == -2

D'où une contradiction. Par conséquent, ~(x+y) != ~x + ~y pour tous x et y (mod 2n).


* Il est intéressant de noter que sur une machine avec son arithmétique complémentaire, l'égalité est en fait vraie pour tous les x et y. C'est parce que sous son complément, ~x = -x. Ainsi, ~x + ~y == -x + -y == -(x+y) == ~(x+y).

237
Alex Lockwood

Complément à deux

Sur la vaste majorité des ordinateurs, si x est un entier, alors -x Est représenté par ~x + 1. De manière équivalente, ~x == -(x + 1). Faire cette substitution dans votre équation donne:

  • ~ x + ~ y == ~ (x + y)
  • - (x + 1) + - (y + 1) = - ((x + y) + 1)
  • -x - y - 2 = -x - y - 1
  • -2 = -1

ce qui est une contradiction, donc ~x + ~y == ~(x + y) est toujours faux .


Cela dit, les pédants remarqueront que C ne nécessite pas de complément à deux, il faut donc aussi considérer ...

Complément

Dans son complément , -x Est simplement représenté par ~x. Zéro est un cas spécial, ayant à la fois les représentations de tous les 0 (+0) Et de tous les 1 (-0), Mais IIRC, C nécessite +0 == -0 Même s'ils ont un bit différent modèles, donc cela ne devrait pas être un problème. Remplacez simplement ~ Par -.

  • ~ x + ~ y == ~ (x + y)
  • -x + (-y) = - (x + y)

qui est vrai pour tous les x et y.

113
dan04

Considérez uniquement le bit le plus à droite de x et y (IE. Si x == 13 lequel est 1101 en base 2, nous ne regarderons que le dernier bit, un 1) Il y a alors quatre cas possibles:

x = 0, y = 0:

LHS: ~ 0 + ~ 0 => 1 + 1 => 10
RHS: ~ (0 + 0) => ~ 0 => 1

x = 0, y = 1:

LHS: ~ 0 + ~ 1 => 1 + 0 => 1
RHS: ~ (0 + 1) => ~ 1 => 0

x = 1, y = 0:

Je vais vous laisser cela car c'est un devoir (indice: c'est le même que le précédent avec x et y permutés).

x = 1, y = 1:

Je vous laisse celui-là aussi.

Vous pouvez montrer que le bit le plus à droite sera toujours différent du côté gauche et du côté droit de l'équation compte tenu de toute entrée possible, vous avez donc prouvé que les deux côtés ne sont pas égaux, car ils ont au moins ce bit qui est inversé de chacun d'eux.

32
Paulpro

Si le nombre de bits est n

~x = (2^n - 1) - x
~y = (2^n - 1) - y


~x + ~y = (2^n - 1) +(2^n - 1) - x - y =>  (2^n + (2^n - 1) - x - y ) - 1 => modulo: (2^n - 1) - x - y - 1.

Maintenant,

 ~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.

Par conséquent, ils seront toujours inégaux, avec une différence de 1.

Indice:

x + ~x = -1 (mod 2n)

En supposant que l'objectif de la question est de tester vos mathématiques (plutôt que vos compétences en lecture des spécifications C), cela devrait vous amener à la réponse.

27
Mehrdad

En complément à un et à deux (et même en 42), cela peut être prouvé:

~x + ~y == ~(x + a) + ~(y - a)

Maintenant, laisse a = y et nous avons:

~x + ~y == ~(x + y) + ~(y - y)

ou:

~x + ~y == ~(x + y) + ~0

Par conséquent, en complément à deux, que ~0 = -1, la proposition est fausse.

Dans son complément que ~0 = 0, la proposition est vraie.

10
ypercubeᵀᴹ

Selon le livre de Dennis Ritchie, C n'implémente pas le complément à deux par défaut. Par conséquent, votre question n'est peut-être pas toujours vraie.

7
user1457474

Laisser MAX_INT Être l'int représenté par 011111...111 (Pour autant de bits qu'il y en a). Alors vous savez que, ~x + x = MAX_INT Et ~y + y = MAX_INT, Vous saurez donc avec certitude que la différence entre ~x + ~y Et ~(x + y) est 1.

5
Adrian Monk

C n'exige pas que le complément à deux soit ce qui est mis en œuvre. Cependant, pour les entiers non signés, des logiques similaires sont appliquées. Les différences seront toujours 1 dans cette logique!

5
user1422551

Bien sûr, C ne nécessite pas ce comportement car il ne nécessite pas de représentation du complément à deux. Par exemple, ~x = (2^n - 1) - x~y = (2^n - 1) - y obtiendra ce résultat.

3
user1472392

Ah, mathématiques discrètes fondamentales!

Découvrez Loi de De Morgan

~x & ~y == ~(x | y)

~x | ~y == ~(x & y)

Très important pour les preuves booléennes!

0
David Kaczynski