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?
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)
.
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:
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 ...
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 -
.
qui est vrai pour tous les x
et y
.
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.
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.
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.
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.
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
.
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!
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.
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!