~ x + ~ y == ~ (x + y) всегда неверно?
Всегда ли этот код вычисляется как false? Обе переменные - это два подписи с подписью.
~x + ~y == ~(x + y)
Я чувствую, что должно быть какое-то число, которое удовлетворяет условиям. Я пробовал тестировать числа между -5000
и 5000
, но никогда не добивался равенства. Есть ли способ настроить уравнение для поиска решений условия?
Поменяет ли одна на другую причину коварной ошибки в моей программе?
Ответы
Ответ 1
Предположим для противоречия, что существует некоторая x
и некоторая y
(mod 2 n) такая, что
~(x+y) == ~x + ~y
В силу двух дополнений *, мы знаем, что
-x == ~x + 1
<==> -1 == ~x + x
Отмечая этот результат, мы имеем
~(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
Следовательно, противоречие. Поэтому ~(x+y) != ~x + ~y
для всех x
и y
(mod 2 n).
* Интересно отметить, что на машине с арифметикой с одним дополнением равенство действительно выполняется для всех x
и y
. Это связано с тем, что под одним дополнением ~x = -x
. Таким образом, ~x + ~y == -x + -y == -(x+y) == ~(x+y)
.
Ответ 2
Два дополнения
На подавляющем большинстве компьютеров, если x
является целым числом, тогда -x
представляется как ~x + 1
. Эквивалентно, ~x == -(x + 1)
. Выполнение этой подстановки в вашем уравнении дает:
- ~ x + ~ y == ~ (x + y)
- - (x + 1) + - (y + 1) = - ((x + y) + 1)
- -x - y - 2 = -x - y - 1
- -2 = -1
что является противоречием, поэтому ~x + ~y == ~(x + y)
всегда false.
Тем не менее, педанты укажут, что C не требует двух дополнений, поэтому мы также должны рассмотреть...
Одно дополнение
В один дополнительный вариант, -x
просто представлен как ~x
. Zero - это особый случай, имеющий представления all-0 (+0
) и all-1 (-0
), но для IIRC, C требуется +0 == -0
, даже если они имеют разные битовые шаблоны, поэтому это не должно быть проблема. Просто замените ~
на -
.
- ~ x + ~ y == ~ (x + y)
- -x + (-y) = - (x + y)
который истина для всех x
и y
.
Ответ 3
Рассмотрим только самый правый бит как x
, так и y
(IE. if x == 13
, который является 1101
в базе 2, мы будем смотреть только на последний бит, a 1
). Тогда есть четыре возможных случая:
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:
Я оставлю это вам, так как это домашнее задание (подсказка: это то же самое, что и предыдущее с заменой x и y).
x = 1, y = 1:
Я оставлю это и вам.
Вы можете показать, что самый правый бит всегда будет отличаться от левой стороны и правой стороны уравнения, учитывая любой возможный вход, поэтому вы доказали, что обе стороны не равны, поскольку они имеют по крайней мере один бит которые перевернуты друг от друга.
Ответ 4
Если число бит равно 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.
Теперь,
~(x + y) = (2^n - 1) - (x + y) = (2^n - 1) - x - y.
Следовательно, они всегда будут неравными, с разницей в 1.
Ответ 5
Подсказка:
x + ~x = -1
(mod 2 n)
Предполагая, что цель вопроса заключается в проверке вашей математики (а не на навыках чтения-C-спецификации), это должно помочь вам ответить.
Ответ 6
В одном и двух (и даже в 42-х) дополнениях это можно доказать:
~x + ~y == ~(x + a) + ~(y - a)
Теперь пусть a = y
и мы имеем:
~x + ~y == ~(x + y) + ~(y - y)
или
~x + ~y == ~(x + y) + ~0
Поэтому в двух дополнениях, что ~0 = -1
, предложение ложно.
В одном дополнении, что ~0 = 0
, предложение истинно.
Ответ 7
Согласно книге Денниса Ричи, C по умолчанию не реализует два дополнения. Поэтому ваш вопрос может не всегда быть правдой.
Ответ 8
Пусть MAX_INT
будет int, представленным 011111...111
(для любого количества бит). Тогда вы знаете, что ~x + x = MAX_INT
и ~y + y = MAX_INT
, поэтому вы наверняка будете знать, что разница между ~x + ~y
и ~(x + y)
равна 1
.
Ответ 9
C не требует, чтобы два дополнения были реализованы. Однако для беззнаковых целочисленных аналогичных логик применяется. Различия всегда будут 1 под этой логикой!
Ответ 10
Конечно, C не требует такого поведения, потому что ему не требуется два дополнительных представления. Например, ~x = (2^n - 1) - x
и ~y = (2^n - 1) - y
получат этот результат.
Ответ 11
Ah, фундаментальная дискретная математика!
Отъезд Закон Де Моргана
~x & ~y == ~(x | y)
~x | ~y == ~(x & y)
Очень важно для булевых доказательств!