153 votes

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

Ce code évalue-t-il toujours false ? Les deux variables sont que deux compléter des entiers signés.

J’ai envie qu’il devrait y avoir un certain nombre qui remplit les conditions. J’ai essayé de tester les numéros entre et mais jamais atteint l’égalité. Est-il possible de mettre en place une équation pour trouver les solutions à l’État ?

Un pour l’autre permutation provoquera un bug insidieux dans mon programme ?

237voto

Alex Lockwood Points 31578

Supposons pour l'amour de la contradiction qu'il existe des x et certains y (2 modn) tels que

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

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

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

En 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

Par conséquent, une contradiction. Par conséquent, ~(x+y) != ~x + ~y tous x et y (2 modn).


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

113voto

dan04 Points 33306

En Complément à deux

Sur la grande majorité des ordinateurs, si x est un entier, alors -x est représenté comme ~x + 1. De manière équivalente, ~x == -(x + 1). Faire de cette substution 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, dira-C ne nécessite pas de complément à deux, donc nous devons également prendre en considération...

Complément

En complément, -x est simplement représenté comme ~x. Zéro est un cas spécial, ayant à la fois tout-0 (+0) et 1 (-0) des représentations, mais autant que je me souvienne, C exige +0 == -0 , même s'ils ont différents modèles de bits, donc il ne devrait pas être un problème. En remplaçant simplement l' ~ avec -.

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

ce qui est vrai pour tous les x et y.

32voto

Paulpro Points 54844

Tenir compte uniquement de l'extrême droite peu des deux x et y (IE. si x == 13 qui 1101 en base 2, nous allons seulement regarder le dernier bit, 1) Alors il y a 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 laisser cela à vous (indice: c'est la même que la précédente avec x et y échangé)

x = 1, y = 1:

Je vais quitter ce jusqu'à vous, car ce sont les devoirs. Bien que cela devrait vraiment être la partie la plus facile haha :)

Vous pouvez montrer que la droite bits sera toujours différent sur le Côté Gauche et le Côté Droit de l'équation donnée aucune entrée possible, de sorte que vous avez prouvé que les deux côtés ne sont pas égaux, car ils ont au moins que l'on peu retournée les uns des autres.

27voto

Si le nombre de bits est n

Maintenant,

Par conséquent, ils vont toujours être inégales, avec une différence de 1.

27voto

Mehrdad Points 70493

Astuce :

``(mod 2<sup>n</sup>)

En supposant que l’objectif de la question met à l’essai vos maths (plutôt que vos compétences de lecture-le-C-spécifications), cela devrait vous aider à la réponse.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X