~ 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)

Очень важно для булевых доказательств!